[][src]Struct async_coap::uri::RelRef

pub struct RelRef(_);

Unsized string-slice type guaranteed to contain a well-formed IETF-RFC3986 relative reference.

The sized counterpart is RelRefBuf.

This type cannot hold a network path. If this type contains a path that looks like a network path, it will be considered degenerate and you will not be able to losslessly convert it to a UriRef or UriRefBuf. See "Network Path Support" for more details.

You can create static constants with this class by using the rel_ref! macro:

    let uri = rel_ref!("/test?query");
    let components = uri.components();
    assert_eq!(None,          components.scheme());
    assert_eq!(None,          components.raw_host());
    assert_eq!(None,          components.port());
    assert_eq!("/test",       components.raw_path());
    assert_eq!(Some("query"), components.raw_query());

RelRef and Deref

You might think that since both relative and absolute URIs are just special cases of URIs that they could both safely implement Deref<Target=UriRef>. This is true for Uri, but not RelRef. This section is dedicated to explaining why.

There is this pesky section 4.2 of RFC3986 that throws a wrench into that noble endeavour:

A path segment that contains a colon character (e.g., "this:that") cannot be used as the first segment of a relative-path reference, as it would be mistaken for a scheme name. Such a segment must be preceded by a dot-segment (e.g., "./this:that") to make a relative- path reference.

This causes big problems for type-safety when derefing a RelRef into a UriRef: there is no way for UriRef to know that it came from a RelRef and thus recognize that something like rel_ref!("this:that") does NOT have a scheme of this.

These are tricky edge cases that have serious security implications---it's important that this case be considered and handled appropriately.

The solution used in this library is to make the transition from RelRef to UriRef not guaranteed. However, a transition from a RelRef to a RelRefBuf is guaranteed, since the offending colon can be escaped in that case. This is preferred instead of prepending a "./", due to the additional complications that could occur when manipulating paths.

You can check any RelRef for this degenerate condition via the method is_degenerate().

Methods

impl RelRef[src]

pub fn from_str(s: &str) -> Result<&RelRef, ParseError>[src]

Attempts to convert a string slice into a &RelRef, returning Err(ParseError) if the string slice contains data that is not a valid relative-reference.

pub fn is_str_valid<S>(s: S) -> bool where
    S: AsRef<str>, 
[src]

Determines if the given string can be considered a well-formed [relative-reference]. [relative-reference]: https://tools.ietf.org/html/rfc3986#section-4.2

pub fn to_rel_ref_buf(&self) -> RelRefBuf[src]

Constructs a new RelRefBuf from a &RelRef, disambiguating if degenerate.

pub fn to_uri_ref_buf(&self) -> UriRefBuf[src]

Constructs a new UriRefBuf from a &RelRef, disambiguating if degenerate.

pub const fn as_str(&self) -> &str[src]

Casts this relative reference to a string slice.

pub fn try_as_uri_ref(&self) -> Option<&UriRef>[src]

Casts a non-degenerate relative reference to a &UriRef. Returns None if the relative reference is degenerate.

pub fn as_uri_ref(&self) -> Cow<UriRef>[src]

Returns a [Cow<UriRef>] that usually just contains a reference to this slice, but will contain an owned instance if this relative reference is degenerate.

impl RelRef[src]

#[must_use = "this returns a new slice, without modifying the original"] pub fn path_as_rel_ref(&self) -> &RelRef[src]

Trims the query and fragment from this relative reference, leaving only the path.

See also RelRef::trim_query.

#[must_use = "this returns a new slice, without modifying the original"] pub fn query_as_rel_ref(&self) -> Option<&RelRef>[src]

See UriRef::query_as_rel_ref for more information.

#[must_use] pub fn raw_path(&self) -> &str[src]

See UriRef::raw_path for more information.

#[must_use = "this returns a new slice, without modifying the original"] pub fn raw_query(&self) -> Option<&str>[src]

See UriRef::raw_query for more information.

#[must_use = "this returns a new slice, without modifying the original"] pub fn raw_fragment(&self) -> Option<&str>[src]

See UriRef::raw_fragment for more information.

#[must_use] pub fn raw_path_segments(&self) -> impl Iterator<Item = &str>[src]

See UriRef::raw_path_segments for more information.

#[must_use] pub fn raw_query_items(&self) -> impl Iterator<Item = &str>[src]

See UriRef::raw_query_items for more information.

#[must_use] pub fn raw_query_key_values(&self) -> impl Iterator<Item = (&str, &str)>[src]

See UriRef::raw_query_key_values for more information.

#[must_use] pub fn fragment(&self) -> Option<Cow<str>>[src]

See UriRef::fragment for more information.

#[must_use] pub fn path_segments(&self) -> impl Iterator<Item = Cow<str>>[src]

See UriRef::path_segments for more information.

#[must_use] pub fn query_items(&self) -> impl Iterator<Item = Cow<str>>[src]

See UriRef::query_items for more information.

#[must_use] pub fn query_key_values(&self) -> impl Iterator<Item = (Cow<str>, Cow<str>)>[src]

See UriRef::query_key_values for more information.

#[must_use] pub fn has_trailing_slash(&self) -> bool[src]

See UriRef::has_trailing_slash for more information.

#[must_use] pub fn colon_in_first_path_segment(&self) -> Option<usize>[src]

Determines if this RelRef is degenerate specifically because it is a relative path with a colon in the first path segment and no special characters appearing before it.

See the section "RelRef" for more details.

pub fn is_degenerate(&self) -> bool[src]

Determines if this RelRef is degenerate.

See the section "RelRef" for more details.

impl RelRef[src]

#[must_use] pub fn resolved_rel_ref<UF>(&self, dest: UF) -> RelRefBuf where
    UF: AsRef<RelRef>, 
[src]

Resolves a relative URI against this relative URI, yielding a new relative URI as a RelRefBuf.

impl RelRef[src]

#[must_use = "this returns the trimmed uri as a new slice, without modifying the original"] pub fn trim_fragment(&self) -> &RelRef[src]

Returns this relative reference slice without the fragment component.

#[must_use = "this returns the trimmed uri as a new slice, without modifying the original"] pub fn trim_query(&self) -> &RelRef[src]

Returns this relative reference slice without the query or fragment components.

#[must_use = "this returns the trimmed uri as a new slice, without modifying the original"] pub fn trim_resource(&self) -> &RelRef[src]

See UriRef::trim_resource for more information.

#[must_use = "this returns the trimmed uri as a new slice, without modifying the original"] pub fn trim_trailing_slash(&self) -> &RelRef[src]

Removes any trailing slash that might be at the end of the path, along with the query and fragment.

If the path consists of a single slash ("/"), then it is not removed.

Examples

use async_coap_uri::prelude::*;
assert_eq!(rel_ref!("a").trim_trailing_slash(),               rel_ref!("a"));
assert_eq!(rel_ref!("a/b/c/?blah#frag").trim_trailing_slash(),rel_ref!("a/b/c"));
assert_eq!(rel_ref!("/").trim_trailing_slash(),               rel_ref!("/"));
assert_eq!(rel_ref!(unsafe "//").trim_trailing_slash(),       rel_ref!("/"));
assert_eq!(rel_ref!(unsafe "//foo/?bar").trim_trailing_slash(),rel_ref!(unsafe "//foo"));

Note that the behavior of this method is different than the behavior for UriRef::trim_trailing_slash: "//" is considered to be a path starting with two slashes rather than a network path with an empty authority and an empty path:

assert_eq!(rel_ref!(unsafe "//").trim_trailing_slash(),    rel_ref!("/"));
assert_eq!(rel_ref!(unsafe "///").trim_trailing_slash(),   rel_ref!(unsafe "//"));
assert_eq!(rel_ref!(unsafe "////").trim_trailing_slash(),  rel_ref!(unsafe "///"));

#[must_use = "this returns the trimmed uri as a new slice, without modifying the original"] pub fn trim_leading_slashes(&self) -> &RelRef[src]

Returns this relative reference slice without any leading slashes.

#[must_use = "this returns the trimmed uri as a new slice, without modifying the original"] pub fn trim_leading_dot_slashes(&self) -> &RelRef[src]

Returns this relative reference slice without any leading instances of "./" or "/.".

#[must_use = "this returns the leading path item trimmed uri as a new slice, without modifying the original"] pub fn trim_leading_path_segment(&self) -> (&str, &RelRef)[src]

Returns this relative reference slice without its first path segment.

#[must_use = "this returns the trimmed uri as a new slice, without modifying the original"] pub fn trim_leading_n_path_segments(&self, n: usize) -> (&str, &RelRef)[src]

Returns a tuple with a string slice contianing the first n path segments and a &RelRef containing the rest of the relative reference.

#[must_use = "this returns the trimmed uri as a new slice, without modifying the original"] pub fn trim_to_shorten(&self, base: &RelRef) -> Option<&RelRef>[src]

Attempts to return a shortened version of this relative reference that is relative to base.

impl RelRef[src]

Unsafe Methods

RelRef needs some unsafe methods in order to function properly. This section is where they are all located.

pub unsafe fn from_str_unchecked(s: &str) -> &RelRef[src]

Converts a string slice to a RelRef slice without checking that the string contains valid URI-Reference.

See the safe version, from_str, for more information.

Safety

This function is unsafe because it does not check that the string passed to it is a valid URI-reference. If this constraint is violated, undefined behavior results.

pub unsafe fn from_str_unchecked_mut(s: &mut str) -> &mut RelRef[src]

Converts a string slice to a RelRef slice without checking that the string contains valid URI-Reference; mutable version.

See the immutable version, from_str_unchecked, for more information.

pub unsafe fn as_mut_str(&mut self) -> &mut str[src]

Returns this slice as a mutable str slice.

Safety

This is unsafe because it allows you to change the contents of the slice in such a way that would make it no longer consistent with the UriRef's promise that it can only ever contain a valid URI-reference.

pub const unsafe fn as_uri_ref_unchecked(&self) -> &UriRef[src]

Directly converts this &RelRef to a &UriRef, without performing the checks that as_uri_ref() does.

This is unsafe for the reasons described here.

#[must_use] pub unsafe fn unsafe_path_segment_iter(&mut self) -> impl Iterator<Item = &str>[src]

Experimental: Similar to raw_path_segment_iter(), but uses the space of the mutable UriRef to individually unescape the items.

Safety

This method is marked as unsafe because the contents of self is undefined after it terminates. The method can be used safely as long the buffer which held self is no longer accessed directly. See [UriUnescapeBuf] for an example.

#[must_use] pub unsafe fn unsafe_query_item_iter(&mut self) -> impl Iterator<Item = &str>[src]

Experimental: Similar to raw_query_item_iter(), but uses the space of the mutable UriRef to individually unescape the query items.

Safety

This method is marked as unsafe because the contents of self is undefined after it terminates. The method can be used safely as long the &mut UriRef (and its owner) is never directly used again. See [UriUnescapeBuf] for an example.

Methods from Deref<Target = str>

pub const fn len(&self) -> usize1.0.0[src]

Returns the length of self.

This length is in bytes, not chars or graphemes. In other words, it may not be what a human considers the length of the string.

Examples

Basic usage:

let len = "foo".len();
assert_eq!(3, len);

let len = "ƒoo".len(); // fancy f!
assert_eq!(4, len);

pub const fn is_empty(&self) -> bool1.0.0[src]

Returns true if self has a length of zero bytes.

Examples

Basic usage:

let s = "";
assert!(s.is_empty());

let s = "not empty";
assert!(!s.is_empty());

pub fn is_char_boundary(&self, index: usize) -> bool1.9.0[src]

Checks that index-th byte lies at the start and/or end of a UTF-8 code point sequence.

The start and end of the string (when index == self.len()) are considered to be boundaries.

Returns false if index is greater than self.len().

Examples

let s = "Löwe 老虎 Léopard";
assert!(s.is_char_boundary(0));
// start of `老`
assert!(s.is_char_boundary(6));
assert!(s.is_char_boundary(s.len()));

// second byte of `ö`
assert!(!s.is_char_boundary(2));

// third byte of `老`
assert!(!s.is_char_boundary(8));

pub const fn as_bytes(&self) -> &[u8]1.0.0[src]

Converts a string slice to a byte slice. To convert the byte slice back into a string slice, use the str::from_utf8 function.

Examples

Basic usage:

let bytes = "bors".as_bytes();
assert_eq!(b"bors", bytes);

pub const fn as_ptr(&self) -> *const u81.0.0[src]

Converts a string slice to a raw pointer.

As string slices are a slice of bytes, the raw pointer points to a u8. This pointer will be pointing to the first byte of the string slice.

The caller must ensure that the returned pointer is never written to. If you need to mutate the contents of the string slice, use as_mut_ptr.

Examples

Basic usage:

let s = "Hello";
let ptr = s.as_ptr();

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output> where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a subslice of str.

This is the non-panicking alternative to indexing the str. Returns None whenever equivalent indexing operation would panic.

Examples

let v = String::from("🗻∈🌏");

assert_eq!(Some("🗻"), v.get(0..4));

// indices not on UTF-8 sequence boundaries
assert!(v.get(1..).is_none());
assert!(v.get(..8).is_none());

// out of bounds
assert!(v.get(..42).is_none());

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output where
    I: SliceIndex<str>, 
1.20.0[src]

Returns a unchecked subslice of str.

This is the unchecked alternative to indexing the str.

Safety

Callers of this function are responsible that these preconditions are satisfied:

  • The starting index must come before the ending index;
  • Indexes must be within bounds of the original slice;
  • Indexes must lie on UTF-8 sequence boundaries.

Failing that, the returned string slice may reference invalid memory or violate the invariants communicated by the str type.

Examples

let v = "🗻∈🌏";
unsafe {
    assert_eq!("🗻", v.get_unchecked(0..4));
    assert_eq!("∈", v.get_unchecked(4..7));
    assert_eq!("🌏", v.get_unchecked(7..11));
}

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str1.0.0[src]

Deprecated since 1.29.0:

use get_unchecked(begin..end) instead

Creates a string slice from another string slice, bypassing safety checks.

This is generally not recommended, use with caution! For a safe alternative see str and Index.

This new slice goes from begin to end, including begin but excluding end.

To get a mutable string slice instead, see the slice_mut_unchecked method.

Safety

Callers of this function are responsible that three preconditions are satisfied:

  • begin must come before end.
  • begin and end must be byte positions within the string slice.
  • begin and end must lie on UTF-8 sequence boundaries.

Examples

Basic usage:

let s = "Löwe 老虎 Léopard";

unsafe {
    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
}

let s = "Hello, world!";

unsafe {
    assert_eq!("world", s.slice_unchecked(7, 12));
}

pub fn split_at(&self, mid: usize) -> (&str, &str)1.4.0[src]

Divide one string slice into two at an index.

The argument, mid, should be a byte offset from the start of the string. It must also be on the boundary of a UTF-8 code point.

The two slices returned go from the start of the string slice to mid, and from mid to the end of the string slice.

To get mutable string slices instead, see the split_at_mut method.

Panics

Panics if mid is not on a UTF-8 code point boundary, or if it is beyond the last code point of the string slice.

Examples

Basic usage:

let s = "Per Martin-Löf";

let (first, last) = s.split_at(3);

assert_eq!("Per", first);
assert_eq!(" Martin-Löf", last);

pub fn chars(&self) -> Chars1.0.0[src]

Returns an iterator over the chars of a string slice.

As a string slice consists of valid UTF-8, we can iterate through a string slice by char. This method returns such an iterator.

It's important to remember that char represents a Unicode Scalar Value, and may not match your idea of what a 'character' is. Iteration over grapheme clusters may be what you actually want.

Examples

Basic usage:

let word = "goodbye";

let count = word.chars().count();
assert_eq!(7, count);

let mut chars = word.chars();

assert_eq!(Some('g'), chars.next());
assert_eq!(Some('o'), chars.next());
assert_eq!(Some('o'), chars.next());
assert_eq!(Some('d'), chars.next());
assert_eq!(Some('b'), chars.next());
assert_eq!(Some('y'), chars.next());
assert_eq!(Some('e'), chars.next());

assert_eq!(None, chars.next());

Remember, chars may not match your human intuition about characters:

let y = "y̆";

let mut chars = y.chars();

assert_eq!(Some('y'), chars.next()); // not 'y̆'
assert_eq!(Some('\u{0306}'), chars.next());

assert_eq!(None, chars.next());

pub fn char_indices(&self) -> CharIndices1.0.0[src]

Returns an iterator over the chars of a string slice, and their positions.

As a string slice consists of valid UTF-8, we can iterate through a string slice by char. This method returns an iterator of both these chars, as well as their byte positions.

The iterator yields tuples. The position is first, the char is second.

Examples

Basic usage:

let word = "goodbye";

let count = word.char_indices().count();
assert_eq!(7, count);

let mut char_indices = word.char_indices();

assert_eq!(Some((0, 'g')), char_indices.next());
assert_eq!(Some((1, 'o')), char_indices.next());
assert_eq!(Some((2, 'o')), char_indices.next());
assert_eq!(Some((3, 'd')), char_indices.next());
assert_eq!(Some((4, 'b')), char_indices.next());
assert_eq!(Some((5, 'y')), char_indices.next());
assert_eq!(Some((6, 'e')), char_indices.next());

assert_eq!(None, char_indices.next());

Remember, chars may not match your human intuition about characters:

let yes = "y̆es";

let mut char_indices = yes.char_indices();

assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
assert_eq!(Some((1, '\u{0306}')), char_indices.next());

// note the 3 here - the last character took up two bytes
assert_eq!(Some((3, 'e')), char_indices.next());
assert_eq!(Some((4, 's')), char_indices.next());

assert_eq!(None, char_indices.next());

pub fn bytes(&self) -> Bytes1.0.0[src]

An iterator over the bytes of a string slice.

As a string slice consists of a sequence of bytes, we can iterate through a string slice by byte. This method returns such an iterator.

Examples

Basic usage:

let mut bytes = "bors".bytes();

assert_eq!(Some(b'b'), bytes.next());
assert_eq!(Some(b'o'), bytes.next());
assert_eq!(Some(b'r'), bytes.next());
assert_eq!(Some(b's'), bytes.next());

assert_eq!(None, bytes.next());

pub fn split_whitespace(&self) -> SplitWhitespace1.1.0[src]

Splits a string slice by whitespace.

The iterator returned will return string slices that are sub-slices of the original string slice, separated by any amount of whitespace.

'Whitespace' is defined according to the terms of the Unicode Derived Core Property White_Space. If you only want to split on ASCII whitespace instead, use split_ascii_whitespace.

Examples

Basic usage:

let mut iter = "A few words".split_whitespace();

assert_eq!(Some("A"), iter.next());
assert_eq!(Some("few"), iter.next());
assert_eq!(Some("words"), iter.next());

assert_eq!(None, iter.next());

All kinds of whitespace are considered:

let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
assert_eq!(Some("Mary"), iter.next());
assert_eq!(Some("had"), iter.next());
assert_eq!(Some("a"), iter.next());
assert_eq!(Some("little"), iter.next());
assert_eq!(Some("lamb"), iter.next());

assert_eq!(None, iter.next());

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace1.34.0[src]

Splits a string slice by ASCII whitespace.

The iterator returned will return string slices that are sub-slices of the original string slice, separated by any amount of ASCII whitespace.

To split by Unicode Whitespace instead, use split_whitespace.

Examples

Basic usage:

let mut iter = "A few words".split_ascii_whitespace();

assert_eq!(Some("A"), iter.next());
assert_eq!(Some("few"), iter.next());
assert_eq!(Some("words"), iter.next());

assert_eq!(None, iter.next());

All kinds of ASCII whitespace are considered:

let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
assert_eq!(Some("Mary"), iter.next());
assert_eq!(Some("had"), iter.next());
assert_eq!(Some("a"), iter.next());
assert_eq!(Some("little"), iter.next());
assert_eq!(Some("lamb"), iter.next());

assert_eq!(None, iter.next());

pub fn lines(&self) -> Lines1.0.0[src]

An iterator over the lines of a string, as string slices.

Lines are ended with either a newline (\n) or a carriage return with a line feed (\r\n).

The final line ending is optional.

Examples

Basic usage:

let text = "foo\r\nbar\n\nbaz\n";
let mut lines = text.lines();

assert_eq!(Some("foo"), lines.next());
assert_eq!(Some("bar"), lines.next());
assert_eq!(Some(""), lines.next());
assert_eq!(Some("baz"), lines.next());

assert_eq!(None, lines.next());

The final line ending isn't required:

let text = "foo\nbar\n\r\nbaz";
let mut lines = text.lines();

assert_eq!(Some("foo"), lines.next());
assert_eq!(Some("bar"), lines.next());
assert_eq!(Some(""), lines.next());
assert_eq!(Some("baz"), lines.next());

assert_eq!(None, lines.next());

pub fn lines_any(&self) -> LinesAny1.0.0[src]

Deprecated since 1.4.0:

use lines() instead now

An iterator over the lines of a string.

pub fn encode_utf16(&self) -> EncodeUtf161.8.0[src]

Returns an iterator of u16 over the string encoded as UTF-16.

Examples

Basic usage:

let text = "Zażółć gęślą jaźń";

let utf8_len = text.len();
let utf16_len = text.encode_utf16().count();

assert!(utf16_len <= utf8_len);

pub fn contains<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a sub-slice of this string slice.

Returns false if it does not.

Examples

Basic usage:

let bananas = "bananas";

assert!(bananas.contains("nana"));
assert!(!bananas.contains("apples"));

pub fn starts_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>, 
1.0.0[src]

Returns true if the given pattern matches a prefix of this string slice.

Returns false if it does not.

Examples

Basic usage:

let bananas = "bananas";

assert!(bananas.starts_with("bana"));
assert!(!bananas.starts_with("nana"));

pub fn ends_with<'a, P>(&'a self, pat: P) -> bool where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns true if the given pattern matches a suffix of this string slice.

Returns false if it does not.

Examples

Basic usage:

let bananas = "bananas";

assert!(bananas.ends_with("anas"));
assert!(!bananas.ends_with("nana"));

pub fn find<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>, 
1.0.0[src]

Returns the byte index of the first character of this string slice that matches the pattern.

Returns None if the pattern doesn't match.

The pattern can be a &str, char, or a closure that determines if a character matches.

Examples

Simple patterns:

let s = "Löwe 老虎 Léopard";

assert_eq!(s.find('L'), Some(0));
assert_eq!(s.find('é'), Some(14));
assert_eq!(s.find("Léopard"), Some(13));

More complex patterns using point-free style and closures:

let s = "Löwe 老虎 Léopard";

assert_eq!(s.find(char::is_whitespace), Some(5));
assert_eq!(s.find(char::is_lowercase), Some(1));
assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));

Not finding the pattern:

let s = "Löwe 老虎 Léopard";
let x: &[_] = &['1', '2'];

assert_eq!(s.find(x), None);

pub fn rfind<'a, P>(&'a self, pat: P) -> Option<usize> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Returns the byte index of the last character of this string slice that matches the pattern.

Returns None if the pattern doesn't match.

The pattern can be a &str, char, or a closure that determines if a character matches.

Examples

Simple patterns:

let s = "Löwe 老虎 Léopard";

assert_eq!(s.rfind('L'), Some(13));
assert_eq!(s.rfind('é'), Some(14));

More complex patterns with closures:

let s = "Löwe 老虎 Léopard";

assert_eq!(s.rfind(char::is_whitespace), Some(12));
assert_eq!(s.rfind(char::is_lowercase), Some(20));

Not finding the pattern:

let s = "Löwe 老虎 Léopard";
let x: &[_] = &['1', '2'];

assert_eq!(s.rfind(x), None);

pub fn split<'a, P>(&'a self, pat: P) -> Split<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by characters matched by a pattern.

The pattern can be any type that implements the Pattern trait. Notable examples are &str, char, and closures that determines the split.

Iterator behavior

The returned iterator will be a DoubleEndedIterator if the pattern allows a reverse search and forward/reverse search yields the same elements. This is true for, e.g., char, but not for &str.

If the pattern allows a reverse search but its results might differ from a forward search, the rsplit method can be used.

Examples

Simple patterns:

let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);

let v: Vec<&str> = "".split('X').collect();
assert_eq!(v, [""]);

let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
assert_eq!(v, ["lion", "", "tiger", "leopard"]);

let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
assert_eq!(v, ["lion", "tiger", "leopard"]);

let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
assert_eq!(v, ["abc", "def", "ghi"]);

let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
assert_eq!(v, ["lion", "tiger", "leopard"]);

A more complex pattern, using a closure:

let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
assert_eq!(v, ["abc", "def", "ghi"]);

If a string contains multiple contiguous separators, you will end up with empty strings in the output:

let x = "||||a||b|c".to_string();
let d: Vec<_> = x.split('|').collect();

assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);

Contiguous separators are separated by the empty string.

let x = "(///)".to_string();
let d: Vec<_> = x.split('/').collect();

assert_eq!(d, &["(", "", "", ")"]);

Separators at the start or end of a string are neighbored by empty strings.

let d: Vec<_> = "010".split("0").collect();
assert_eq!(d, &["", "1", ""]);

When the empty string is used as a separator, it separates every character in the string, along with the beginning and end of the string.

let f: Vec<_> = "rust".split("").collect();
assert_eq!(f, &["", "r", "u", "s", "t", ""]);

Contiguous separators can lead to possibly surprising behavior when whitespace is used as the separator. This code is correct:

let x = "    a  b c".to_string();
let d: Vec<_> = x.split(' ').collect();

assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);

It does not give you:

This example is not tested
assert_eq!(d, &["a", "b", "c"]);

Use split_whitespace for this behavior.

pub fn rsplit<'a, P>(&'a self, pat: P) -> RSplit<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by characters matched by a pattern and yielded in reverse order.

The pattern can be any type that implements the Pattern trait. Notable examples are &str, char, and closures that determines the split.

Iterator behavior

The returned iterator requires that the pattern supports a reverse search, and it will be a DoubleEndedIterator if a forward/reverse search yields the same elements.

For iterating from the front, the split method can be used.

Examples

Simple patterns:

let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);

let v: Vec<&str> = "".rsplit('X').collect();
assert_eq!(v, [""]);

let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
assert_eq!(v, ["leopard", "tiger", "", "lion"]);

let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
assert_eq!(v, ["leopard", "tiger", "lion"]);

A more complex pattern, using a closure:

let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
assert_eq!(v, ["ghi", "def", "abc"]);

pub fn split_terminator<'a, P>(&'a self, pat: P) -> SplitTerminator<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by characters matched by a pattern.

The pattern can be any type that implements the Pattern trait. Notable examples are &str, char, and closures that determines the split.

Equivalent to split, except that the trailing substring is skipped if empty.

This method can be used for string data that is terminated, rather than separated by a pattern.

Iterator behavior

The returned iterator will be a DoubleEndedIterator if the pattern allows a reverse search and forward/reverse search yields the same elements. This is true for, e.g., char, but not for &str.

If the pattern allows a reverse search but its results might differ from a forward search, the rsplit_terminator method can be used.

Examples

Basic usage:

let v: Vec<&str> = "A.B.".split_terminator('.').collect();
assert_eq!(v, ["A", "B"]);

let v: Vec<&str> = "A..B..".split_terminator(".").collect();
assert_eq!(v, ["A", "", "B", ""]);

pub fn rsplit_terminator<'a, P>(&'a self, pat: P) -> RSplitTerminator<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of self, separated by characters matched by a pattern and yielded in reverse order.

The pattern can be any type that implements the Pattern trait. Notable examples are &str, char, and closures that determines the split. Additional libraries might provide more complex patterns like regular expressions.

Equivalent to split, except that the trailing substring is skipped if empty.

This method can be used for string data that is terminated, rather than separated by a pattern.

Iterator behavior

The returned iterator requires that the pattern supports a reverse search, and it will be double ended if a forward/reverse search yields the same elements.

For iterating from the front, the split_terminator method can be used.

Examples

let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
assert_eq!(v, ["B", "A"]);

let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
assert_eq!(v, ["", "B", "", "A"]);

pub fn splitn<'a, P>(&'a self, n: usize, pat: P) -> SplitN<'a, P> where
    P: Pattern<'a>, 
1.0.0[src]

An iterator over substrings of the given string slice, separated by a pattern, restricted to returning at most n items.

If n substrings are returned, the last substring (the nth substring) will contain the remainder of the string.

The pattern can be any type that implements the Pattern trait. Notable examples are &str, char, and closures that determines the split.

Iterator behavior

The returned iterator will not be double ended, because it is not efficient to support.

If the pattern allows a reverse search, the rsplitn method can be used.

Examples

Simple patterns:

let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
assert_eq!(v, ["Mary", "had", "a little lambda"]);

let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
assert_eq!(v, ["lion", "", "tigerXleopard"]);

let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
assert_eq!(v, ["abcXdef"]);

let v: Vec<&str> = "".splitn(1, 'X').collect();
assert_eq!(v, [""]);

A more complex pattern, using a closure:

let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
assert_eq!(v, ["abc", "defXghi"]);

pub fn rsplitn<'a, P>(&'a self, n: usize, pat: P) -> RSplitN<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

An iterator over substrings of this string slice, separated by a pattern, starting from the end of the string, restricted to returning at most n items.

If n substrings are returned, the last substring (the nth substring) will contain the remainder of the string.

The pattern can be any type that implements the Pattern trait. Notable examples are &str, char, and closures that determines the split.

Iterator behavior

The returned iterator will not be double ended, because it is not efficient to support.

For splitting from the front, the splitn method can be used.

Examples

Simple patterns:

let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
assert_eq!(v, ["lamb", "little", "Mary had a"]);

let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
assert_eq!(v, ["leopard", "tiger", "lionX"]);

let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
assert_eq!(v, ["leopard", "lion::tiger"]);

A more complex pattern, using a closure:

let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
assert_eq!(v, ["ghi", "abc1def"]);

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P> where
    P: Pattern<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within the given string slice.

The pattern can be any type that implements the Pattern trait. Notable examples are &str, char, and closures that determines the split.

Iterator behavior

The returned iterator will be a DoubleEndedIterator if the pattern allows a reverse search and forward/reverse search yields the same elements. This is true for, e.g., char, but not for &str.

If the pattern allows a reverse search but its results might differ from a forward search, the rmatches method can be used.

Examples

Basic usage:

let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
assert_eq!(v, ["abc", "abc", "abc"]);

let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
assert_eq!(v, ["1", "2", "3"]);

pub fn rmatches<'a, P>(&'a self, pat: P) -> RMatches<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.2.0[src]

An iterator over the disjoint matches of a pattern within this string slice, yielded in reverse order.

The pattern can be a &str, char, or a closure that determines if a character matches.

Iterator behavior

The returned iterator requires that the pattern supports a reverse search, and it will be a DoubleEndedIterator if a forward/reverse search yields the same elements.

For iterating from the front, the matches method can be used.

Examples

Basic usage:

let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
assert_eq!(v, ["abc", "abc", "abc"]);

let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
assert_eq!(v, ["3", "2", "1"]);

pub fn match_indices<'a, P>(&'a self, pat: P) -> MatchIndices<'a, P> where
    P: Pattern<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within this string slice as well as the index that the match starts at.

For matches of pat within self that overlap, only the indices corresponding to the first match are returned.

The pattern can be a &str, char, or a closure that determines if a character matches.

Iterator behavior

The returned iterator will be a DoubleEndedIterator if the pattern allows a reverse search and forward/reverse search yields the same elements. This is true for, e.g., char, but not for &str.

If the pattern allows a reverse search but its results might differ from a forward search, the rmatch_indices method can be used.

Examples

Basic usage:

let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);

let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
assert_eq!(v, [(1, "abc"), (4, "abc")]);

let v: Vec<_> = "ababa".match_indices("aba").collect();
assert_eq!(v, [(0, "aba")]); // only the first `aba`

pub fn rmatch_indices<'a, P>(&'a self, pat: P) -> RMatchIndices<'a, P> where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.5.0[src]

An iterator over the disjoint matches of a pattern within self, yielded in reverse order along with the index of the match.

For matches of pat within self that overlap, only the indices corresponding to the last match are returned.

The pattern can be a &str, char, or a closure that determines if a character matches.

Iterator behavior

The returned iterator requires that the pattern supports a reverse search, and it will be a DoubleEndedIterator if a forward/reverse search yields the same elements.

For iterating from the front, the match_indices method can be used.

Examples

Basic usage:

let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);

let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
assert_eq!(v, [(4, "abc"), (1, "abc")]);

let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
assert_eq!(v, [(2, "aba")]); // only the last `aba`

#[must_use = "this returns the trimmed string as a slice, without modifying the original"] pub fn trim(&self) -> &str1.0.0[src]

Returns a string slice with leading and trailing whitespace removed.

'Whitespace' is defined according to the terms of the Unicode Derived Core Property White_Space.

Examples

Basic usage:

let s = " Hello\tworld\t";

assert_eq!("Hello\tworld", s.trim());

#[must_use = "this returns the trimmed string as a new slice, without modifying the original"] pub fn trim_start(&self) -> &str1.30.0[src]

Returns a string slice with leading whitespace removed.

'Whitespace' is defined according to the terms of the Unicode Derived Core Property White_Space.

Text directionality

A string is a sequence of bytes. start in this context means the first position of that byte string; for a left-to-right language like English or Russian, this will be left side, and for right-to-left languages like like Arabic or Hebrew, this will be the right side.

Examples

Basic usage:

let s = " Hello\tworld\t";
assert_eq!("Hello\tworld\t", s.trim_start());

Directionality:

let s = "  English  ";
assert!(Some('E') == s.trim_start().chars().next());

let s = "  עברית  ";
assert!(Some('ע') == s.trim_start().chars().next());

#[must_use = "this returns the trimmed string as a new slice, without modifying the original"] pub fn trim_end(&self) -> &str1.30.0[src]

Returns a string slice with trailing whitespace removed.

'Whitespace' is defined according to the terms of the Unicode Derived Core Property White_Space.

Text directionality

A string is a sequence of bytes. end in this context means the last position of that byte string; for a left-to-right language like English or Russian, this will be right side, and for right-to-left languages like like Arabic or Hebrew, this will be the left side.

Examples

Basic usage:

let s = " Hello\tworld\t";
assert_eq!(" Hello\tworld", s.trim_end());

Directionality:

let s = "  English  ";
assert!(Some('h') == s.trim_end().chars().rev().next());

let s = "  עברית  ";
assert!(Some('ת') == s.trim_end().chars().rev().next());

pub fn trim_left(&self) -> &str1.0.0[src]

Deprecated since 1.33.0:

superseded by trim_start

Returns a string slice with leading whitespace removed.

'Whitespace' is defined according to the terms of the Unicode Derived Core Property White_Space.

Text directionality

A string is a sequence of bytes. 'Left' in this context means the first position of that byte string; for a language like Arabic or Hebrew which are 'right to left' rather than 'left to right', this will be the right side, not the left.

Examples

Basic usage:

let s = " Hello\tworld\t";

assert_eq!("Hello\tworld\t", s.trim_left());

Directionality:

let s = "  English";
assert!(Some('E') == s.trim_left().chars().next());

let s = "  עברית";
assert!(Some('ע') == s.trim_left().chars().next());

pub fn trim_right(&self) -> &str1.0.0[src]

Deprecated since 1.33.0:

superseded by trim_end

Returns a string slice with trailing whitespace removed.

'Whitespace' is defined according to the terms of the Unicode Derived Core Property White_Space.

Text directionality

A string is a sequence of bytes. 'Right' in this context means the last position of that byte string; for a language like Arabic or Hebrew which are 'right to left' rather than 'left to right', this will be the left side, not the right.

Examples

Basic usage:

let s = " Hello\tworld\t";

assert_eq!(" Hello\tworld", s.trim_right());

Directionality:

let s = "English  ";
assert!(Some('h') == s.trim_right().chars().rev().next());

let s = "עברית  ";
assert!(Some('ת') == s.trim_right().chars().rev().next());

#[must_use = "this returns the trimmed string as a new slice, without modifying the original"] pub fn trim_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: DoubleEndedSearcher<'a>, 
1.0.0[src]

Returns a string slice with all prefixes and suffixes that match a pattern repeatedly removed.

The pattern can be a char or a closure that determines if a character matches.

Examples

Simple patterns:

assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");

let x: &[_] = &['1', '2'];
assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");

A more complex pattern, using a closure:

assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");

#[must_use = "this returns the trimmed string as a new slice, without modifying the original"] pub fn trim_start_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.30.0[src]

Returns a string slice with all prefixes that match a pattern repeatedly removed.

The pattern can be a &str, char, or a closure that determines if a character matches.

Text directionality

A string is a sequence of bytes. start in this context means the first position of that byte string; for a left-to-right language like English or Russian, this will be left side, and for right-to-left languages like like Arabic or Hebrew, this will be the right side.

Examples

Basic usage:

assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");

let x: &[_] = &['1', '2'];
assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");

#[must_use = "this returns the trimmed string as a new slice, without modifying the original"] pub fn trim_end_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.30.0[src]

Returns a string slice with all suffixes that match a pattern repeatedly removed.

The pattern can be a &str, char, or a closure that determines if a character matches.

Text directionality

A string is a sequence of bytes. end in this context means the last position of that byte string; for a left-to-right language like English or Russian, this will be right side, and for right-to-left languages like like Arabic or Hebrew, this will be the left side.

Examples

Simple patterns:

assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");

let x: &[_] = &['1', '2'];
assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");

A more complex pattern, using a closure:

assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");

pub fn trim_left_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>, 
1.0.0[src]

Deprecated since 1.33.0:

superseded by trim_start_matches

Returns a string slice with all prefixes that match a pattern repeatedly removed.

The pattern can be a &str, char, or a closure that determines if a character matches.

Text directionality

A string is a sequence of bytes. 'Left' in this context means the first position of that byte string; for a language like Arabic or Hebrew which are 'right to left' rather than 'left to right', this will be the right side, not the left.

Examples

Basic usage:

assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");

let x: &[_] = &['1', '2'];
assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");

pub fn trim_right_matches<'a, P>(&'a self, pat: P) -> &'a str where
    P: Pattern<'a>,
    <P as Pattern<'a>>::Searcher: ReverseSearcher<'a>, 
1.0.0[src]

Deprecated since 1.33.0:

superseded by trim_end_matches

Returns a string slice with all suffixes that match a pattern repeatedly removed.

The pattern can be a &str, char, or a closure that determines if a character matches.

Text directionality

A string is a sequence of bytes. 'Right' in this context means the last position of that byte string; for a language like Arabic or Hebrew which are 'right to left' rather than 'left to right', this will be the left side, not the right.

Examples

Simple patterns:

assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");

let x: &[_] = &['1', '2'];
assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");

A more complex pattern, using a closure:

assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err> where
    F: FromStr
1.0.0[src]

Parses this string slice into another type.

Because parse is so general, it can cause problems with type inference. As such, parse is one of the few times you'll see the syntax affectionately known as the 'turbofish': ::<>. This helps the inference algorithm understand specifically which type you're trying to parse into.

parse can parse any type that implements the FromStr trait.

Errors

Will return Err if it's not possible to parse this string slice into the desired type.

Examples

Basic usage

let four: u32 = "4".parse().unwrap();

assert_eq!(4, four);

Using the 'turbofish' instead of annotating four:

let four = "4".parse::<u32>();

assert_eq!(Ok(4), four);

Failing to parse:

let nope = "j".parse::<u32>();

assert!(nope.is_err());

pub fn is_ascii(&self) -> bool1.23.0[src]

Checks if all characters in this string are within the ASCII range.

Examples

let ascii = "hello!\n";
let non_ascii = "Grüße, Jürgen ❤";

assert!(ascii.is_ascii());
assert!(!non_ascii.is_ascii());

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool1.23.0[src]

Checks that two strings are an ASCII case-insensitive match.

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), but without allocating and copying temporaries.

Examples

assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));

pub fn escape_debug(&self) -> EscapeDebug1.34.0[src]

Return an iterator that escapes each char in self with char::escape_debug.

Note: only extended grapheme codepoints that begin the string will be escaped.

Examples

As an iterator:

for c in "❤\n!".escape_debug() {
    print!("{}", c);
}
println!();

Using println! directly:

println!("{}", "❤\n!".escape_debug());

Both are equivalent to:

println!("❤\\n!");

Using to_string:

assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");

pub fn escape_default(&self) -> EscapeDefault1.34.0[src]

Return an iterator that escapes each char in self with char::escape_default.

Examples

As an iterator:

for c in "❤\n!".escape_default() {
    print!("{}", c);
}
println!();

Using println! directly:

println!("{}", "❤\n!".escape_default());

Both are equivalent to:

println!("\\u{{2764}}\\n!");

Using to_string:

assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");

pub fn escape_unicode(&self) -> EscapeUnicode1.34.0[src]

Return an iterator that escapes each char in self with char::escape_unicode.

Examples

As an iterator:

for c in "❤\n!".escape_unicode() {
    print!("{}", c);
}
println!();

Using println! directly:

println!("{}", "❤\n!".escape_unicode());

Both are equivalent to:

println!("\\u{{2764}}\\u{{a}}\\u{{21}}");

Using to_string:

assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");

#[must_use = "this returns the replaced string as a new allocation, without modifying the original"] pub fn replace<'a, P>(&'a self, from: P, to: &str) -> String where
    P: Pattern<'a>, 
1.0.0[src]

Replaces all matches of a pattern with another string.

replace creates a new String, and copies the data from this string slice into it. While doing so, it attempts to find matches of a pattern. If it finds any, it replaces them with the replacement string slice.

Examples

Basic usage:

let s = "this is old";

assert_eq!("this is new", s.replace("old", "new"));

When the pattern doesn't match:

let s = "this is old";
assert_eq!(s, s.replace("cookie monster", "little lamb"));

#[must_use = "this returns the replaced string as a new allocation, without modifying the original"] pub fn replacen<'a, P>(&'a self, pat: P, to: &str, count: usize) -> String where
    P: Pattern<'a>, 
1.16.0[src]

Replaces first N matches of a pattern with another string.

replacen creates a new String, and copies the data from this string slice into it. While doing so, it attempts to find matches of a pattern. If it finds any, it replaces them with the replacement string slice at most count times.

Examples

Basic usage:

let s = "foo foo 123 foo";
assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));

When the pattern doesn't match:

let s = "this is old";
assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));

pub fn to_lowercase(&self) -> String1.2.0[src]

Returns the lowercase equivalent of this string slice, as a new String.

'Lowercase' is defined according to the terms of the Unicode Derived Core Property Lowercase.

Since some characters can expand into multiple characters when changing the case, this function returns a String instead of modifying the parameter in-place.

Examples

Basic usage:

let s = "HELLO";

assert_eq!("hello", s.to_lowercase());

A tricky example, with sigma:

let sigma = "Σ";

assert_eq!("σ", sigma.to_lowercase());

// but at the end of a word, it's ς, not σ:
let odysseus = "ὈΔΥΣΣΕΎΣ";

assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());

Languages without case are not changed:

let new_year = "农历新年";

assert_eq!(new_year, new_year.to_lowercase());

pub fn to_uppercase(&self) -> String1.2.0[src]

Returns the uppercase equivalent of this string slice, as a new String.

'Uppercase' is defined according to the terms of the Unicode Derived Core Property Uppercase.

Since some characters can expand into multiple characters when changing the case, this function returns a String instead of modifying the parameter in-place.

Examples

Basic usage:

let s = "hello";

assert_eq!("HELLO", s.to_uppercase());

Scripts without case are not changed:

let new_year = "农历新年";

assert_eq!(new_year, new_year.to_uppercase());

One character can become multiple:

let s = "tschüß";

assert_eq!("TSCHÜSS", s.to_uppercase());

pub fn repeat(&self, n: usize) -> String1.16.0[src]

Creates a new String by repeating a string n times.

Panics

This function will panic if the capacity would overflow.

Examples

Basic usage:

assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));

A panic upon overflow:

fn main() {
    // this will panic at runtime
    "0123456789abcdef".repeat(usize::max_value());
}

pub fn to_ascii_uppercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its ASCII upper case equivalent.

ASCII letters 'a' to 'z' are mapped to 'A' to 'Z', but non-ASCII letters are unchanged.

To uppercase the value in-place, use make_ascii_uppercase.

To uppercase ASCII characters in addition to non-ASCII characters, use to_uppercase.

Examples

let s = "Grüße, Jürgen ❤";

assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());

pub fn to_ascii_lowercase(&self) -> String1.23.0[src]

Returns a copy of this string where each character is mapped to its ASCII lower case equivalent.

ASCII letters 'A' to 'Z' are mapped to 'a' to 'z', but non-ASCII letters are unchanged.

To lowercase the value in-place, use make_ascii_lowercase.

To lowercase ASCII characters in addition to non-ASCII characters, use to_lowercase.

Examples

let s = "Grüße, Jürgen ❤";

assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());

Trait Implementations

impl AsRef<RelRef> for RelRefBuf[src]

impl AsRef<RelRef> for RelRef[src]

impl AsRef<str> for RelRef[src]

impl Display for RelRef[src]

RelRef will always format the relative reference for display in an unambiguous fashion.

impl<T> PartialOrd<T> for RelRef where
    T: AsRef<str> + ?Sized
[src]

#[must_use] fn lt(&self, other: &Rhs) -> bool1.0.0[src]

This method tests less than (for self and other) and is used by the < operator. Read more

#[must_use] fn le(&self, other: &Rhs) -> bool1.0.0[src]

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

#[must_use] fn gt(&self, other: &Rhs) -> bool1.0.0[src]

This method tests greater than (for self and other) and is used by the > operator. Read more

#[must_use] fn ge(&self, other: &Rhs) -> bool1.0.0[src]

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

impl Ord for RelRef[src]

fn max(self, other: Self) -> Self1.21.0[src]

Compares and returns the maximum of two values. Read more

fn min(self, other: Self) -> Self1.21.0[src]

Compares and returns the minimum of two values. Read more

fn clamp(self, min: Self, max: Self) -> Self[src]

🔬 This is a nightly-only experimental API. (clamp)

Restrict a value to a certain interval. Read more

impl Eq for RelRef[src]

impl AnyUriRef for RelRef[src]

fn uri_type(&self) -> UriType[src]

Determines what kind of relative reference this is:

This function may return any one of the following values:

fn components(&self) -> UriRawComponents[src]

Breaks down this relative reference into its raw components.

#[must_use] fn display(&self) -> UriDisplay<Self>[src]

Wraps this AnyUriRef instance in a [UriDisplay] object for use with formatting macros like write! and format!. Read more

#[must_use] fn to_uri_ref_buf(&self) -> UriRefBuf[src]

Creates a new [UriRefBuf] from this [AnyUriRef]. Read more

fn write_resolved<T, D>(
    &self,
    target: &D,
    f: &mut T
) -> Result<(), ResolveError> where
    D: AnyUriRef + ?Sized,
    T: Write + ?Sized
[src]

Writes out to a [core::fmt::Write] instance the result of performing URI resolution against target, with self being the base URI. Read more

#[must_use] fn resolved<T>(&self, dest: &T) -> Result<UriRefBuf, ResolveError> where
    T: AnyUriRef + ?Sized
[src]

Creates a new [UriRefBuf] that contains the result of performing URI resolution with dest. Read more

impl Deref for RelRef[src]

type Target = str

The resulting type after dereferencing.

impl Debug for RelRef[src]

impl ToOwned for RelRef[src]

type Owned = RelRefBuf

The resulting type after obtaining ownership.

fn clone_into(&self, target: &mut Self::Owned)[src]

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

impl<'_> Default for &'_ mut RelRef[src]

fn default() -> &'_ mut RelRef[src]

Mutable version of (&RelRef)::default.

Despite being marked mutable, since the length is zero the value is effectively immutable.

impl<'_> Default for &'_ RelRef[src]

fn default() -> &'_ RelRef[src]

Returns an empty relative reference.

Empty relative references do nothing but clear the base fragment when resolved against a base.

impl Hash for RelRef[src]

fn hash_slice<H>(data: &[Self], state: &mut H) where
    H: Hasher
1.3.0[src]

Feeds a slice of this type into the given [Hasher]. Read more

impl<'_> From<&'_ RelRef> for RelRefBuf[src]

impl<'_> From<&'_ RelRef> for UriRefBuf[src]

impl Borrow<RelRef> for RelRefBuf[src]

impl<T> PartialEq<T> for RelRef where
    T: AsRef<str> + ?Sized
[src]

#[must_use] fn ne(&self, other: &Rhs) -> bool1.0.0[src]

This method tests for !=.

Auto Trait Implementations

impl Send for RelRef

impl Unpin for RelRef

impl Sync for RelRef

impl RefUnwindSafe for RelRef

impl UnwindSafe for RelRef

Blanket Implementations

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]