为什么我在 Rust 中取出数组的一部分后不能打印它?

Why can't I print an array after I've taken a slice of it in Rust?

当函数不打算修改数据并且所有权上下文不止于此时,为什么我不能将数据传递给该函数?

这段代码报错:

let mut ar = [1, 2, 3, 4, 5];
let slice = &mut ar[1..=3];
slice[1] = 9;
println!("{:?} ", slice);
for e in ar.iter(){
    println!("{}", e)
}

这是错误:

error[E0502]: cannot borrow `ar` as immutable because it is also borrowed as mutable
 --> src/main.rs:6:14
  |
3 |     let slice = &mut ar[1..=3];
  |                      -- mutable borrow occurs here
...
6 |     for e in ar.iter() {
  |              ^^ immutable borrow occurs here
...
9 | }
  | - mutable borrow ends here

我的猜测是我们不能将数组传递给println!函数,因为我们借用了它,但我不明白为什么。 println! 函数不会改变它!

我发现以下行为很难理解。如果我有数组切片,如何打印数组?

此代码有效并打印 [2, 9, 4]

let mut ar = [1, 2, 3, 4, 5];
let slice = &mut ar[1..=3];
slice[1] = 9;
println!("{:?} ", slice);

此外,这段代码可以正常工作并正确打印所有内容,通过修改切片我们修改了原始数组!

let mut ar = [1, 2, 3, 4, 5];
{
    let slice = &mut ar[1..=3];
    slice[1] = 9;
    println!("{:?} ", slice); // -> [2, 9, 4]
}
for e in ar.iter(){
    println!("{}", e) //-> 1 2 9 4 5 as expected since the slice has changed
}

如果你上一个例子,你似乎已经找到了答案,但你似乎仍然有点困惑。

这里的 println! 根本不是问题(请注意这里实际上非常准确的错误消息根本没有提到它)。问题是 slices 变量可变地从 ar 借用,并且当 ar.iter() 试图从 ar 借用时 slices 仍然存在。你不能同时有一个可变的和不可变的借用,所以编译器会阻止你。

正如您已经发现的那样,一个解决方案是确保在使用 ar.iter()(借用 ar)时不存在可变 slices 借用。


至于为什么 编译器阻止你这样做,是因为它不希望不可变借用的值在你之下意外改变。基本上,当你为 ar.iter 不变地借用 ar 时,如果基础数据突然改变,那将是非常奇怪的。但是由于 slice 已经可变地借用了相同的数据,您 可以 在循环中放置一些代码,通过 slice 更改 ar,这会影响迭代器。编译器不希望你这样做。它保证您不能的方式是确保在进行不可变借用时不存在可变借用(在本例中为slice)。现在,它不检查是否有代码实际试图在循环中使用可变借用,它只是保证不可能有。