Задать вопрос
@Eugene523

В чем разница между str и &str?

В документации сказано, что str - это срез, хотя срез это &str. str - это значение. Почему значение называется срезом?
  • Вопрос задан
  • 570 просмотров
Подписаться 3 Простой Комментировать
Решения вопроса 1
Erik_Mironov
@Erik_Mironov
Старые вопросы: *Dies from cringe*
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, если вам нужно только представление строки.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
vabka
@vabka Куратор тега Rust
В принципе тут уже есть хорошие ответы, но я перефразирую, чтобы было чуть понятнее другим.

str - это встроенный тип, который представляет из себя последовательность из байтов utf8.
Размер значения str не известен во время компиляции, а по тому нигде его нельзя применить в чистом виде (только как содержимое какого-нибудь типа-указателя)
Можно провести аналогию с массивом (только в случае массивов размер таки известен, но его тоже достаточно редко используют в таком чистом виде)

&str - это ссылка на эту последовательность байт.
Это может быть ссылка на содержимое String или ссылка на строковый литерал (&'static str)

Кстати, String под капотом - это Vec<u8>
Ответ написан
Комментировать
@Sasha_88
str тип - это неизменяемый тип строки в Rust. У него известен размер и статическое время жизни&'static str. Это тип строковых литералов как тут "hello, world". Он известен на момент компиляции и состоит непосредственно из байт, представляющих строку в UTF-8. То есть является значением. Из-за особенностей UTF-8 количество байт может быть больше чем длина строки. Расширяемым, владеющим, изменяемым типом является тип String. В нем строки так же закодированы в UTF-8. Под него память выделяется в куче во время выполнения. Переменная содержит указатель на начало строки, длину строки и емкость. А &str - это ссылка на строку. В Rust ссылки являются заимствующими. Ссылка на строку является срезом строки(указатель и длина), который может заимствовать и указывать на строку типа str и на строку типа String. То есть работает с обоими типами строк. Причем срез строки может указывать как на всю строку, так и на ее часть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы