wig*_*igy 7 language-lawyer rust
答案是什么锈病的`String`之间的区别`str`?描述了如何&str和String相互关系.
令人惊讶的是,a str比固定大小的数组更有限,因为它不能被声明为局部变量.编译
let arr_owned = [0u8; 32];
let arr_slice = &arr_owned;
let str_slice = "apple";
let str_owned = *str_slice;
Run Code Online (Sandbox Code Playgroud)
在Rust 1.32.0中,我明白了
error[E0277]: the size for values of type `str` cannot be known at compilation time
--> src/lib.rs:6:9
Run Code Online (Sandbox Code Playgroud)
这是令人困惑的,因为"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,但确实可能是一个有趣的补充!但是可能存在它为什么还不存在的原因,例如因为Unicode字符串的长度通常不是真正相关的.特别是,"采用具有三个字节的Unicode字符串"通常没有意义.
[T]并且str不能存储在堆栈中,因为它们都是未分级的
虽然今天也是如此,但未来可能并非如此.RFC 1909引入了未定义的rvalues.此功能提供的功能之一是可变长度数组:
RFC还描述了数组文字语法的扩展:
[e; dyn n].在语法中,n不一定是常量表达式.该数组在堆栈上动态分配
没有提到字符串是否可以直接使用,但是总是可以创建一个堆栈分配的字节数组来用作字符串的存储空间.
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |