Rust 为什么锈能说明问题;“编译时大小未知”;而不是(无效)片到片分配中的另一个错误?

Rust 为什么锈能说明问题;“编译时大小未知”;而不是(无效)片到片分配中的另一个错误?,rust,Rust,我有一段奇怪的代码,我知道Rust编译器会拒绝它,但我不理解具体的错误消息 TL;博士为什么Rust拒绝使用“编译时没有已知大小”而不是“非法语法”或“无法将切片分配给切片”之类的内容 这是代码。理论上,它应该用切片data2中的数据替换data1的子切片。(我知道,正确的方法是使用for循环)。但让我们看看这个。他说: error[E0277]: the size for values of type `[{integer}]` cannot be known at compilation t

我有一段奇怪的代码,我知道Rust编译器会拒绝它,但我不理解具体的错误消息

TL;博士为什么Rust拒绝使用“编译时没有已知大小”而不是“非法语法”或“无法将切片分配给切片”之类的内容

这是代码。理论上,它应该用切片
data2
中的数据替换
data1
的子切片。(我知道,正确的方法是使用for循环)。但让我们看看这个。他说:

error[E0277]: the size for values of type `[{integer}]` cannot be known at compilation time
 --> src\main.rs:4:5
  |
4 |     data1[1..3] = *data2;
  |     ^^^^^^^^^^^ doesn't have a size known at compile-time
  |
  = help: the trait `std::marker::Sized` is not implemented for `[{integer}]`
为什么
data1[1..3]
处的错误只出现在作业的左侧?我希望Rust编译器告诉我错误在赋值的右边,甚至整个赋值的右边。类似于
“无法将片分配给片”


但为什么锈菌能准确地传达这一信息呢?为什么在这种情况下,
data1[1..3]
的大小未知?当然,
[{integer}]
不是
大小的
。但是在这一点上不需要堆栈分配吗?我期待任何其他错误消息。

我看不到作业左侧的一个片段,编译器也看不到

始终尽可能地减少示例,大多数情况下,这样做会发现编译器实际上在抱怨什么。因此,如果您尝试写下以下内容:

让data1=[0u8,1,2,3];
设x=data1[1..3];
您将看到,在您的示例中,编译器实际上在抱怨什么:

error[E0277]:编译时无法知道类型为“[u8]”的值的大小
-->src/main.rs:4:9
|
4 |设x=data1[1..3];
^ ^ ----------------------------------DATA1(1…3)
|         |
|在编译时没有已知的大小
你看,
[T]
&T]
之间有很大的区别
[T]
T
s的连续序列,而
&[T]
是该连续序列的动态大小视图。前者没有静态已知的大小,而后者则有

在你说你使用了
Vec::as_slice
方法之前,你试着从一个切片中取一个切片,也就是说:

//data1的类型是`&[u8]`
让data1=vec![0u8,1,2,3].as_slice();
//`x`的类型为`[u8]`
//(编译时没有已知的大小
设x=data1[1..3];
所以我相信你的问题的答案是,编译器没有达到它可以实际查看赋值的另一面的程度,因为当它试图找出左边的时候,它已经发现了一个问题:一个在编译时没有已知大小的表达式

现在,如果你真的要在左手边写一个切片:

让mut data1=[0u8,1,2,3];
设data2=[8u8,9];
&mut data1[1..3]=&data2[…];
然后编译器会抱怨左手边的无效性质(除其他外):

错误[E0070]:赋值的左侧无效
-->src/main.rs:6:22
|
6 |&mut data1[1..3]=&data2[…];
|     ---------------- ^
|     |
|无法分配给此表达式
error[E0277]: the size for values of type `[{integer}]` cannot be known at compilation time
 --> src\main.rs:4:5
  |
4 |     data1[1..3] = *data2;
  |     ^^^^^^^^^^^ doesn't have a size known at compile-time
  |
  = help: the trait `std::marker::Sized` is not implemented for `[{integer}]`