What are the differences between Rust's `String` and `str`?的答案描述了&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
而不破坏大量现有代码?
Vec<T>
[T; N]
和String
str
之间的不对称
那是因为你在这里混淆了一些东西。关系是这样的:
Vec<T>
⇔[T]
String
⇔str
在所有这四种类型中,长度信息存储在运行时,而不是编译时。固定大小的数组([T; N]
)在这方面是不同的:它们在编译时存储长度,但不存储运行时!
事实上,[T]
和str
都无法存储在堆栈中,因为它们都是未分级的。
一个
str[N]
类型,这将是一个[u8; N]
的简写,只包含可证明有效的UTF-8编码字符串,取代str
而不破坏大量现有代码?
它不会取代str
,但它确实是一个有趣的补充!但是可能存在它为什么不存在的原因,例如因为the length of a Unicode string is usually not really relevant。特别是,“采用具有三个字节的Unicode字符串”通常没有意义。
[T]
和str
不能存储在堆栈中,因为它们都是未分级的
虽然今天也是如此,但未来可能并非如此。 RFC 1909 introduces unsized rvalues。这个功能给予的权力之一是variable-length arrays:
RFC还描述了数组文字语法的扩展:
[e; dyn n]
。在语法中,n
不一定是常量表达式。该数组在堆栈上动态分配
没有提到字符串是否可以直接使用,但是总是可以创建一个堆栈分配的字节数组来用作字符串的存储空间。