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

9gm1akwq  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(75)

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

7hiiyaii

7hiiyaii1#

因为在某些上下文中可以使用未调整大小的类型,如str[T]dyn MyTrait
目前最常见的是泛型。例如,您可以拥有Box<[T]>Box<str>Arc<[T]>或任何具有?Sized绑定的泛型。
还有一些正在开发中的特性使用了这样的unsized类型:

  • 您可以定义一个struct,其中包含一个unsized字段,使结构体本身不被调整大小。不过目前还没有什么用处,因为你实际上无法创建这样一个结构。
  • RFC-1909在实现时,将允许您在堆栈上,在args中等使用未调整大小的类型。通过在堆栈上动态地分配它们。不过,我不指望它会很快发生。
p3rjfoxz

p3rjfoxz2#

但为什么他们没有在下面的上下文中使[T]成为语法错误呢?
因为语法中没有任何东西是无效的?
虽然DST很难使用,并且在任何地方都没有意义,但在某些情况下它们是完全法律的的,例如。

struct Foo {
    a: usize,
    b: [i32]
}

字符串

相关问题