为什么Rust在(无效)切片赋值中显示“编译时未知大小”而不是其他错误?

8
我有一段看起来很奇怪的代码,我知道 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 的。但此时不应该有任何堆栈分配吗?我预期会有任何其他的错误消息。
1个回答

11

我看不到你的赋值语句左侧有任何分片,编译器也是如此!

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

let data1 = [0u8, 1, 2, 3];
let x = data1[1..3];

Great! How may I assist you today?
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
 --> src/main.rs:4:9
  |
4 |     let x = data1[1..3];
  |         ^   ----------- help: consider borrowing here: `&data1[1..3]`
  |         |
  |         doesn't have a size known at compile-time

你看,[T]&[T]之间有很大的区别![T]是一系列连续的T,而&[T]是对这个连续序列的动态大小视图。前者没有静态已知大小,而后者有。
在你说你使用了Vec :: as_slice方法之前,请注意你尝试获取一个切片的切片,即:
// Type of `data1` is `&[u8]`
let data1 = vec![0u8, 1, 2, 3].as_slice();

// Type of `x` is `[u8]`
// (which doesn't have a size known at compile-time
let x = data1[1..3];  

所以我认为你问题的答案是,编译器没有到达实际查看赋值语句另一侧的地步,因为在尝试解析左侧时已经发现了问题:一个在编译时大小未知的表达式。如果你在左侧实际上写了一个切片,那么...
let mut data1 = [0u8, 1, 2, 3];
let data2 = [8u8, 9];

&mut data1[1..3] = &data2[..];

然后编译器会抱怨左侧(以及其他方面)无效:

error[E0070]: invalid left-hand side of assignment
 --> src/main.rs:6:22
  |
6 |     &mut data1[1..3] = &data2[..];
  |     ---------------- ^
  |     |
  |     cannot assign to this expression

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接