【发布时间】:2020-07-30 21:47:55
【问题描述】:
我有一段看起来很奇怪的代码,我知道 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 编译器会告诉错误位于赋值的右侧,甚至是整个赋值。类似"can't assign a slice to a slice"。
但是为什么 Rust 会准确地传达这个信息呢?为什么data1[1..3] 在这种情况下大小未知?当然[{integer}] 不是Sized。但是此时应该不需要堆栈分配吗?我期待任何其他错误消息。
【问题讨论】:
标签: rust