我有一段看起来很奇怪的代码,我知道 Rust 编译器会拒绝它,但我不明白具体的错误信息。
TL;DR;:为什么 Rust 会用“在编译时大小未知”而不是类似“非法语法”或“无法将切片分配给切片”的东西来拒绝这个?
这是代码。理论上它应该用切片
为什么赋值语句的左侧
但为什么 Rust 恰好会提示这样的消息呢?为什么在这种情况下,
TL;DR;:为什么 Rust 会用“在编译时大小未知”而不是类似“非法语法”或“无法将切片分配给切片”的东西来拒绝这个?
fn main() {
let mut data1 = vec![0, 1, 2, 3].as_slice();
let mut data2 = vec![8, 9].as_slice();
data1[1..3] = *data2; // of course this is illegal; but I don't understand the error message
}
这是代码。理论上它应该用切片
data2
中的数据来替换data1
的子切片。(正确的方式可能是使用for循环,但我们来看看这个)。但是,让我们看看Rust编译器的反应: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 编译器指出了右侧或整个赋值语句出现了错误,例如 "无法将一个切片分配给另一个切片"
。但为什么 Rust 恰好会提示这样的消息呢?为什么在这种情况下,
data1[1..3]
的大小是未知的?当然,[{integer}]
是没有 Sized
的。但此时不应该有任何堆栈分配吗?我预期会有任何其他的错误消息。