在 Rust 中,为什么'[T]'和'str'切片类型不是语法错误?



据我所知,&[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]
}

最新更新