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

据我了解,&[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,这只是一个错误,让我,用户,理解为什么这种语法是不可能的,还是因为我没有正确使用这种语法并且它在某些上下文中有效?

编辑:修正错别字

回答

因为它是可以使用未分级的类型,如str[T]以及dyn MyTrait在某些情况下。

目前最常见的是泛型。你可以,例如,有一个Box<[T]>Box<str>Arc<[T]>或任何常规用?Sized绑定。

还有一些正在开发的功能使用此类未调整大小的类型:

  • 您可以struct使用一个未调整大小的字段定义 a ,从而使结构本身未调整大小。不过目前相当无用,因为您实际上无法创建这样的结构。
  • RFC-1909实现后,将允许您通过在堆栈上动态分配它们,在堆栈、参数等中使用未调整大小的类型。不过,我不会指望它会很快发生。

以上是在Rust中,为什么'[T]'和'str'切片类型不是语法错误?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>