str
представляет собой неизменяемую последовательность байтов UTF-8 динамической длины где-то в памяти. Поскольку размер неизвестен, его можно обрабатывать только за указателем. Это означает, что
str
чаще всего используется как
&str
— ссылка на некоторые данные UTF-8, обычно называемые «срезом строки» или просто «срезом».
Срез — это просто представление данных, и эти данные могут быть где угодно, например:
-
В статическом хранилище: строковый литерал "foo"представляет собой файл
&'static str.
Данные жестко закодированы в исполняемый файл и загружаются в память при запуске программы.
-
Внутри выделенной кучи:
String разыменовывает представление &str в строке.
-
На стеке: Например, в следующем примере создается массив байтов, выделенный стеком, а затем он получает
представление этих данных как &str:
use std::str;
let x: &[u8] = &[b'a', b'b', b'c'];
let stack_str: &str = str::from_utf8(x).unwrap();
Используйте
String
, если вам требуется владение строковыми данными (например, передача строк в другие потоки или их создание во время выполнения), и используйте
&str
, если вам нужно только представление строки.