据我所知,&[T]
类型是一个“胖”指针(内存地址和大小),而不是切片本身,[T]
是被引用的实际切片。但是为什么他们没有在下面的上下文中将[T]
作为语法错误呢?
let y: [i32; 6] = [1, 2, 3, 4, 5, 6];
// let z: [i32] = y[..]; // error: the size for values of type `[i32]` cannot be known at compilation time
let z: &[i32] = &y[..]; // OK
// let v: str = "Hello World"; // the size for values of type `str` cannot be known at compilation time
字符串
从错误:[i32] cannot be known at compilation
,这只是一个错误,让我,用户,理解为什么这个语法是不可能的,或者是因为我没有正确使用这个语法,它在某些上下文中是有效的?
2条答案
按热度按时间7hiiyaii1#
因为在某些上下文中可以使用未调整大小的类型,如
str
、[T]
和dyn MyTrait
。目前最常见的是泛型。例如,您可以拥有
Box<[T]>
或Box<str>
、Arc<[T]>
或任何具有?Sized
绑定的泛型。还有一些正在开发中的特性使用了这样的unsized类型:
struct
,其中包含一个unsized字段,使结构体本身不被调整大小。不过目前还没有什么用处,因为你实际上无法创建这样一个结构。p3rjfoxz2#
但为什么他们没有在下面的上下文中使[T]成为语法错误呢?
因为语法中没有任何东西是无效的?
虽然DST很难使用,并且在任何地方都没有意义,但在某些情况下它们是完全法律的的,例如。
字符串