在 Rust 中,为什么 '[T]' 和 'str' 切片类型不是语法错误?
In Rust, why is '[T]' and 'str' slice type not a syntax error?
据我了解,&[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
绑定的泛型。
还有一些开发中的功能使用了此类未确定大小的类型:
- You can define a
struct
with one unsized field, making the struct itself unsized. 不过目前还没什么用,因为您实际上无法创建这样的结构。
- RFC-1909 实现后,将允许您通过在堆栈上动态分配它们来在堆栈、args 等中使用未确定大小的类型。不过,我不会指望它很快就会发生。
But why didn't they make [T] a syntax error in the context below?
因为语法没有任何理由无效?
虽然 DST 难以使用并且在任何地方都没有意义,但在某些情况下它们是完全合法的,例如
struct Foo {
a: usize,
b: [i32]
}
据我了解,&[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
绑定的泛型。
还有一些开发中的功能使用了此类未确定大小的类型:
- You can define a
struct
with one unsized field, making the struct itself unsized. 不过目前还没什么用,因为您实际上无法创建这样的结构。 - RFC-1909 实现后,将允许您通过在堆栈上动态分配它们来在堆栈、args 等中使用未确定大小的类型。不过,我不会指望它很快就会发生。
But why didn't they make [T] a syntax error in the context below?
因为语法没有任何理由无效?
虽然 DST 难以使用并且在任何地方都没有意义,但在某些情况下它们是完全合法的,例如
struct Foo {
a: usize,
b: [i32]
}