Примитивный тип str
Строковые срезы
Смотрите также модуль std::str.
Тип str, также называемый "строковым срезом", является наиболее примитивным строковым типом. Обычно встречается в заимствованной форме &str. Также это тип строковых литералов &'static str.
Базовое использование
Строковые литералы являются строковыми срезами:
#![allow(unused)] fn main() { let hello_world = "Hello, World!"; }
Здесь мы объявили строковый срез, инициализированный строковым литералом. Строковые литералы имеют статическое время жизни ('static), что означает, что строка hello_world гарантированно будет корректной на протяжении всей программы. Мы также можем явно указать время жизни hello_world:
#![allow(unused)] fn main() { let hello_world: &'static str = "Hello, world!"; }
Представление
&str состоит из двух компонентов: указателя на байты и длины. Вы можете посмотреть их с помощью методов as_ptr и len:
#![allow(unused)] fn main() { use std::slice; use std::str; let story = "Once upon a time..."; let ptr = story.as_ptr(); let len = story.len(); // story имеет девятнадцать байтов assert_eq!(19, len); // Мы можем воссоздать str из ptr и len. Это небезопасно, потому что // мы ответственны за то, чтобы оба компонента были корректны: let s = unsafe { // Сначала строим &[u8]... let slice = slice::from_raw_parts(ptr, len); // ... и затем преобразуем этот срез в строковый срез str::from_utf8(slice) }; assert_eq!(s, Ok(story)); }
Примечание: Этот пример показывает внутреннее устройство &str. unsafe не должен использоваться для получения строкового среза в обычных обстоятельствах. Вместо этого используйте as_str.
Инвариант
Библиотеки Rust могут предполагать, что строковые срезы всегда являются корректным UTF-8.
Создание не-UTF-8 строкового среза не является немедленным неопределённым поведением, но любая функция, вызванная на строковом срезе, может предполагать, что он является корректным UTF-8, что означает, что не-UTF-8 строковый срез может привести к неопределённому поведению в дальнейшем.
Реализации
impl str
Методы
pub const fn len(&self) -> usize
Возвращает длину self.
Эта длина измеряется в байтах, не в символах или графемах. Другими словами, это может не соответствовать тому, что человек считает длиной строки.
Примеры:
#![allow(unused)] fn main() { let len = "foo".len(); assert_eq!(3, len); assert_eq!("ƒoo".len(), 4); // модная f! assert_eq!("ƒoo".chars().count(), 3); }
pub const fn is_empty(&self) -> bool
Возвращает true, если self имеет нулевую длину в байтах.
Примеры:
#![allow(unused)] fn main() { let s = ""; assert!(s.is_empty()); let s = "not empty"; assert!(!s.is_empty()); }
pub const fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error>
Преобразует срез байтов в строковый срез.
Строковый срез (&str) состоит из байтов (u8), и срез байтов (&[u8]) также состоит из байтов, поэтому эта функция выполняет преобразование между ними. Однако не все срезы байтов являются корректными строковыми срезами: &str требует, чтобы данные были корректным UTF-8. from_utf8() проверяет, являются ли байты корректным UTF-8, и затем выполняет преобразование.
Если вы уверены, что срез байтов является корректным UTF-8, и не хотите тратить ресурсы на проверку валидности, существует небезопасная версия этой функции - from_utf8_unchecked, которая имеет такое же поведение, но пропускает проверку.
Если вам нужна String вместо &str, рассмотрите String::from_utf8.
Поскольку вы можете разместить [u8; N] в стеке и взять из него &[u8], эта функция является одним из способов получить строку, размещённую в стеке.
Ошибки:
Возвращает Err, если срез не является UTF-8, с описанием причины.
Примеры:
#![allow(unused)] fn main() { // несколько байтов в векторе let sparkle_heart = vec![240, 159, 146, 150]; // Мы можем использовать оператор ? (try) для проверки let sparkle_heart = str::from_utf8(&sparkle_heart)?; assert_eq!("💖", sparkle_heart); }
pub const fn from_utf8_mut(v: &mut [u8]) -> Result<&mut str, Utf8Error>
Преобразует изменяемый срез байтов в изменяемый строковый срез.
Примеры:
#![allow(unused)] fn main() { // "Hello, Rust!" в виде изменяемого вектора let mut hellorust = vec![72, 101, 108, 108, 111, 44, 32, 82, 117, 115, 116, 33]; let outstr = str::from_utf8_mut(&mut hellorust).unwrap(); assert_eq!("Hello, Rust!", outstr); }
pub const unsafe fn from_utf8_unchecked(v: &[u8]) -> &str
Преобразует срез байтов в строковый срез без проверки того, что строка содержит корректный UTF-8.
Безопасность: Переданные байты должны быть корректным UTF-8.
Примеры:
#![allow(unused)] fn main() { let sparkle_heart = vec![240, 159, 146, 150]; let sparkle_heart = unsafe { str::from_utf8_unchecked(&sparkle_heart) }; assert_eq!("💖", sparkle_heart); }
pub const unsafe fn from_utf8_unchecked_mut(v: &mut [u8]) -> &mut str
Преобразует срез байтов в строковый срез без проверки того, что строка содержит корректный UTF-8; изменяемая версия.
Примеры:
#![allow(unused)] fn main() { let mut heart = vec![240, 159, 146, 150]; let heart = unsafe { str::from_utf8_unchecked_mut(&mut heart) }; assert_eq!("💖", heart); }
pub const fn is_char_boundary(&self, index: usize) -> bool
Проверяет, является ли index-ный байт первым байтом в последовательности UTF-8 или концом строки.
Начало и конец строки (когда index == self.len()) считаются границами.
Возвращает false, если index больше self.len().
Примеры:
#![allow(unused)] fn main() { let s = "Löwe 老虎 Léopard"; assert!(s.is_char_boundary(0)); assert!(s.is_char_boundary(6)); assert!(s.is_char_boundary(s.len())); assert!(!s.is_char_boundary(2)); // второй байт `ö` assert!(!s.is_char_boundary(8)); // третий байт `老` }
pub const fn floor_char_boundary(&self, index: usize) -> usize
Находит ближайший x, не превышающий index, где is_char_boundary(x) истинно.
Примеры:
#![allow(unused)] fn main() { let s = "❤️🧡💛💚💙💜"; assert_eq!(s.len(), 26); assert!(!s.is_char_boundary(13)); let closest = s.floor_char_boundary(13); assert_eq!(closest, 10); assert_eq!(&s[..closest], "❤️🧡"); }
pub const fn ceil_char_boundary(&self, index: usize) -> usize
Находит ближайший x, не меньший index, где is_char_boundary(x) истинно.
Примеры:
#![allow(unused)] fn main() { let s = "❤️🧡💛💚💙💜"; let closest = s.ceil_char_boundary(13); assert_eq!(closest, 14); assert_eq!(&s[..closest], "❤️🧡💛"); }
pub const fn as_bytes(&self) -> &[u8]
Преобразует строковый срез в срез байтов.
Примеры:
#![allow(unused)] fn main() { let bytes = "bors".as_bytes(); assert_eq!(b"bors", bytes); }
pub const unsafe fn as_bytes_mut(&mut self) -> &mut [u8]
Преобразует изменяемый строковый срез в изменяемый срез байтов.
Безопасность: Вызывающий должен гарантировать, что содержимое среза остаётся корректным UTF-8.
Примеры:
#![allow(unused)] fn main() { let mut s = String::from("🗻∈🌏"); unsafe { let bytes = s.as_bytes_mut(); bytes[0] = 0xF0; bytes[1] = 0x9F; bytes[2] = 0x8D; bytes[3] = 0x94; } assert_eq!("🍔∈🌏", s); }
pub const fn as_ptr(&self) -> *const u8
Преобразует строковый срез в необработанный указатель.
Примеры:
#![allow(unused)] fn main() { let s = "Hello"; let ptr = s.as_ptr(); }
pub const fn as_mut_ptr(&mut self) -> *mut u8
Преобразует изменяемый строковый срез в необработанный указатель.
pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output>
Возвращает под-срез str.
Это непанующий альтернатива индексации str. Возвращает None, когда эквивалентная операция индексации вызвала бы панику.
Примеры:
#![allow(unused)] fn main() { let v = String::from("🗻∈🌏"); assert_eq!(Some("🗻"), v.get(0..4)); assert!(v.get(1..).is_none()); // не на границе UTF-8 }
pub fn get_mut<I>(&mut self, i: I) -> Option<&mut <I as SliceIndex<str>>::Output>
Возвращает изменяемый под-срез str.
pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output
Возвращает непроверенный под-срез str.
pub unsafe fn get_unchecked_mut<I>(&mut self, i: I) -> &mut <I as SliceIndex<str>>::Output
Возвращает изменяемый непроверенный под-срез str.
pub const fn split_at(&self, mid: usize) -> (&str, &str)
Делит один строковый срез на два по индексу.
Паника:
Паникует, если mid не находится на границе кодовой точки UTF-8.
Примеры:
#![allow(unused)] fn main() { let s = "Per Martin-Löf"; let (first, last) = s.split_at(3); assert_eq!("Per", first); assert_eq!(" Martin-Löf", last); }
pub const fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str)
Делит один изменяемый строковый срез на два по индексу.
pub const fn split_at_checked(&self, mid: usize) -> Option<(&str, &str)>
Делит один строковый срез на два по индексу. Возвращает None, если индекс некорректен.
pub const fn split_at_mut_checked(&mut self, mid: usize) -> Option<(&mut str, &mut str)>
Делит один изменяемый строковый срез на два по индексу. Возвращает None, если индекс некорректен.
pub fn chars(&self) -> Chars<'_>
Возвращает итератор по символам (char) строкового среза.
Примеры:
#![allow(unused)] fn main() { let word = "goodbye"; let mut chars = word.chars(); assert_eq!(Some('g'), chars.next()); }
pub fn char_indices(&self) -> CharIndices<'_>
Возвращает итератор по символам строкового среза и их позициям.
pub fn bytes(&self) -> Bytes<'_>
Возвращает итератор по байтам строкового среза.
pub fn split_whitespace(&self) -> SplitWhitespace<'_>
Разделяет строковый срез по пробельным символам Unicode.
pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>
Разделяет строковый срез по ASCII пробельным символам.
pub fn lines(&self) -> Lines<'_>
Возвращает итератор по строкам текста.
pub fn encode_utf16(&self) -> EncodeUtf16<'_>
Возвращает итератор u16 над строкой, закодированной как UTF-16.
pub fn contains<P>(&self, pat: P) -> bool
Возвращает true, если данный паттерн соответствует под-срезу этой строки.
pub fn starts_with<P>(&self, pat: P) -> bool
Возвращает true, если данный паттерн соответствует префиксу этой строки.
pub fn ends_with<P>(&self, pat: P) -> bool
Возвращает true, если данный паттерн соответствует суффиксу этой строки.
pub fn find<P>(&self, pat: P) -> Option<usize>
Возвращает байтовый индекс первого символа, соответствующего паттерну.
pub fn rfind<P>(&self, pat: P) -> Option<usize>
Возвращает байтовый индекс первого символа последнего совпадения паттерна.
pub fn split<P>(&self, pat: P) -> Split<'_, P>
Возвращает итератор по подстрокам, разделённым паттерном.
pub fn split_inclusive<P>(&self, pat: P) -> SplitInclusive<'_, P>
Возвращает итератор по подстрокам, включая разделитель в конец подстроки.
pub fn rsplit<P>(&self, pat: P) -> RSplit<'_, P>
Возвращает итератор по подстрокам в обратном порядке.
pub fn split_terminator<P>(&self, pat: P) -> SplitTerminator<'_, P>
Возвращает итератор по подстрокам, пропуская пустую завершающую подстроку.
pub fn rsplit_terminator<P>(&self, pat: P) -> RSplitTerminator<'_, P>
Возвращает итератор по подстрокам в обратном порядке, пропуская пустую завершающую подстроку.
pub fn splitn<P>(&self, n: usize, pat: P) -> SplitN<'_, P>
Возвращает итератор по подстрокам, ограниченный n элементами.
pub fn rsplitn<P>(&self, n: usize, pat: P) -> RSplitN<'_, P>
Возвращает итератор по подстрокам в обратном порядке, ограниченный n элементами.
pub fn split_once<P>(&self, delimiter: P) -> Option<(&str, &str)>
Разделяет строку по первому вхождению разделителя.
pub fn rsplit_once<P>(&self, delimiter: P) -> Option<(&str, &str)>
Разделяет строку по последнему вхождению разделителя.
pub fn matches<P>(&self, pat: P) -> Matches<'_, P>
Возвращает итератор по непересекающимся совпадениям паттерна.
pub fn rmatches<P>(&self, pat: P) -> RMatches<'_, P>
Возвращает итератор по непересекающимся совпадениям паттерна в обратном порядке.
pub fn match_indices<P>(&self, pat: P) -> MatchIndices<'_, P>
Возвращает итератор по совпадениям паттерна и их индексам.
pub fn rmatch_indices<P>(&self, pat: P) -> RMatchIndices<'_, P>
Возвращает итератор по совпадениям паттерна и их индексам в обратном порядке.
pub fn trim(&self) -> &str
Возвращает строковый срез с удалёнными начальными и конечными пробельными символами Unicode.
pub fn trim_start(&self) -> &str
Возвращает строковый срез с удалёнными начальными пробельными символами.
pub fn trim_end(&self) -> &str
Возвращает строковый срез с удалёнными конечными пробельными символами.
pub fn trim_matches<P>(&self, pat: P) -> &str
Возвращает строковый срез с удалёнными всеми префиксами и суффиксами, соответствующими паттерну.
pub fn trim_start_matches<P>(&self, pat: P) -> &str
Возвращает строковый срез с удалёнными всеми префиксами, соответствующими паттерну.
pub fn strip_prefix<P>(&self, prefix: P) -> Option<&str>
Возвращает строковый срез с удалённым префиксом (точно один раз).
pub fn strip_suffix<P>(&self, suffix: P) -> Option<&str>
Возвращает строковый срез с удалённым суффиксом (точно один раз).
pub fn trim_end_matches<P>(&self, pat: P) -> &str
Возвращает строковый срез с удалёнными всеми суффиксами, соответствующими паттерну.
pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err>
Парсит этот строковый срез в другой тип.
pub const fn is_ascii(&self) -> bool
Проверяет, находятся ли все символы в строке в диапазоне ASCII.
pub const fn eq_ignore_ascii_case(&self, other: &str) -> bool
Проверяет, являются ли две строки одинаковыми без учёта регистра ASCII.
pub const fn make_ascii_uppercase(&mut self)
Преобразует строку в верхний регистр ASCII на месте.
pub const fn make_ascii_lowercase(&mut self)
Преобразует строку в нижний регистр ASCII на месте.
pub const fn trim_ascii_start(&self) -> &str
Возвращает строковый срез с удалёнными начальными пробельными символами ASCII.
pub const fn trim_ascii_end(&self) -> &str
Возвращает строковый срез с удалёнными конечными пробельными символами ASCII.
pub const fn trim_ascii(&self) -> &str
Возвращает строковый срез с удалёнными начальными и конечными пробельными символами ASCII.
pub fn escape_debug(&self) -> EscapeDebug<'_>
Возвращает итератор, экранирующий каждый символ с помощью char::escape_debug.
pub fn escape_default(&self) -> EscapeDefault<'_>
Возвращает итератор, экранирующий каждый символ с помощью char::escape_default.
pub fn escape_unicode(&self) -> EscapeUnicode<'_>
Возвращает итератор, экранирующий каждый символ с помощью char::escape_unicode.
impl str (Методы для строковых срезов)
pub fn into_boxed_bytes(self: Box<str>) -> Box<[u8]>
Преобразует Box<str> в Box<[u8]> без копирования или аллокации.
pub fn replace<P>(&self, from: P, to: &str) -> String
Заменяет все вхождения паттерна другой строкой.
pub fn replacen<P>(&self, pat: P, to: &str, count: usize) -> String
Заменяет первые N вхождений паттерна другой строкой.
pub fn to_lowercase(&self) -> String
Возвращает строку в нижнем регистре Unicode.
pub fn to_uppercase(&self) -> String
Возвращает строку в верхнем регистре Unicode.
pub fn repeat(&self, n: usize) -> String
Создаёт новую String, повторяя строку n раз.
pub fn to_ascii_uppercase(&self) -> String
Возвращает копию строки, где каждый символ преобразован в верхний регистр ASCII.
pub fn to_ascii_lowercase(&self) -> String
Возвращает копию строки, где каждый символ преобразован в нижний регистр ASCII.
Реализации трейтов
impl<'a> Add<&'a str> for Cow<'a, str>
impl Add<&str> for String
impl<'a> AddAssign<&'a str> for Cow<'a, str>
impl AddAssign<&str> for String
impl AsMut<str> for String
impl AsRef<[u8]> for str
impl AsRef<OsStr> for str
impl AsRef<Path> for str
impl Borrow<str> for String
impl BorrowMut<str> for String
impl Clone for Box<str>
impl Debug for str
impl Default for &str
impl Display for str
impl<'a> Extend<&'a str> for String
impl From<&str> for String
impl From<&str> for Vec<u8>
impl<'a> FromIterator<&'a str> for String
impl Hash for str
impl<I> Index<I> for str
impl<I> IndexMut<I> for str
impl Ord for str
impl PartialEq for str
impl PartialOrd for str
impl<'b> Pattern for &'b str
impl ToOwned for str
impl ToSocketAddrs for str
impl Eq for str
Автоматические реализации трейтов
Freeze for strRefUnwindSafe for strSend for str!Sized for str(не имеет размера во время компиляции)Sync for strUnpin for strUnwindSafe for str