据我所知,&[T]
类型是一个"fat"指针(内存地址和大小(,而不是切片本身,[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
,这只是一个错误,让我,用户,理解为什么这个语法不可能,还是因为我没有正确使用这个语法,它在某些上下文中是有效的?
因为在某些上下文中可以使用str
、[T]
和dyn MyTrait
等未大小的类型。
目前最常见的是泛型。例如,您可以具有Box<[T]>
或Box<str>
、Arc<[T]>
,或任何绑定了?Sized
的泛型。
还有一些正在开发中的特性使用了这种无尺寸类型:
- 您可以定义一个具有一个未大小字段的
struct
,从而使结构本身不大小。不过,目前还没什么用,因为你实际上无法创建这样的结构 - RFC-1909在实现时,将允许您通过在堆栈上动态分配类型,在堆栈、参数等中使用未大小的类型。不过,我不指望它会很快发生
但他们为什么没有在下面的上下文中使[t]出现语法错误?
因为语法中没有任何无效的原因?
虽然DST很难使用,而且在任何地方都没有意义,但在某些情况下它们是完全合法的,例如
struct Foo {
a: usize,
b: [i32]
}