Почему массивы фиксированного размера могут быть в стеке, а str - нет? - PullRequest
0 голосов
/ 13 февраля 2019

Ответы на Каковы различия между `String` и` str` в Rust? описывает, как &str и String связаны друг с другом.

Что удивительно, так это то, чтоstr более ограничен, чем массив фиксированного размера, потому что он не может быть объявлен как локальная переменная.Скомпилировав

let arr_owned = [0u8; 32];
let arr_slice = &arr_owned;

let str_slice = "apple";
let str_owned = *str_slice;

в Rust 1.32.0, я получаю

error[E0277]: the size for values of type `str` cannot be known at compilation time
 --> src/lib.rs:6:9

, что сбивает с толку, потому что размер "apple" может быть известен компилятору, он просто не является частьютипа str.

Существует ли лингвистическая причина асимметрии между типами Vec<T> <-> [T; N] и String <-> str?Может ли тип str[N], который был бы сокращен до [u8; N], который содержит только достоверно допустимые строки в кодировке UTF-8, заменить str без прерывания большого количества существующего кода?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

[T] и str не могут быть сохранены в стеке, потому что они оба не имеют размера

Хотя это верно сегодня, это может быть не так в будущем, В RFC 1909 вводятся неопределяемые значения .Одной из возможностей этой функции является массивы переменной длины :

RFC также описывает расширение синтаксиса литерала массива: [e; dyn n].В синтаксисе n не обязательно является константным выражением.Массив динамически размещается в стеке

Не упоминается о том, будет ли строка возможна напрямую, но всегда можно создать выделенный стеком массив байтов дляиспользуется как хранилище для строки.

0 голосов
/ 13 февраля 2019

асимметрия между Vec<T> <-> [T; N] и String <-> str

Это потому, что вы что-то здесь перепутали.Отношения примерно такие:

  • Vec<T>[T]
  • Stringstr

Во всех этих четырех типахинформация о длине хранится во время выполнения, а не во время компиляции.Массивы фиксированного размера ([T; N]) отличаются в этом отношении: они хранят длину во время компиляции, но не во время выполнения!

И действительно, [T] и str не могут быть сохранены в стекепотому что они оба не имеют размера.

Может быть тип str[N], который будет сокращением к [u8; N], который содержит только доказуемо действительные строки в кодировке UTF-8, замените str без прерываниямного существующего кода?

Это не заменит str, но это действительно может быть интересным дополнением!Но, вероятно, есть причины, по которым он еще не существует, например, потому что длина строки Unicode обычно не имеет значения .В частности, обычно не имеет смысла «принимать строку Unicode с ровно тремя байтами».

...