gpt4 book ai didi

rust - 为什么只有在声明在循环之外时才会发生这种不变性错误?

转载 作者:行者123 更新时间:2023-11-29 08:28:42 25 4
gpt4 key购买 nike

我正在尝试用从文件中获取的一些数据填充缓冲区,然后从该缓冲区中读取数据以处理这些数据。所有这些都在循环中迭代。

如果我这样做,它会完美编译:

use std::fs::File;
use std::io::{BufReader, IoSliceMut, Read};

fn do_something(buffer_0: &[u8; 8], buffer_1: &[u8; 2]) {
// Do something
}

fn main() {
let file = File::open("/path/to/file").expect("Error opening file");

let mut reader = BufReader::new(file);
let buffer_0 = &mut [0; 8];
let buffer_1 = &mut [0; 2];

loop {
let buffer = &mut [IoSliceMut::new(buffer_0), IoSliceMut::new(buffer_1)];
reader
.read_vectored(buffer)
.expect("Error reading from file");
do_something(buffer_0, buffer_1);
}
}

现在,如果我在循环外声明 buffer,如下所示:

use std::fs::File;
use std::io::{BufReader, IoSliceMut, Read};

fn do_something(buffer_0: &[u8; 8], buffer_1: &[u8; 2]) {
// Do something
}

fn main() {
let file = File::open("/path/to/file").expect("Error opening file");

let mut reader = BufReader::new(file);
let buffer_0 = &mut [0; 8];
let buffer_1 = &mut [0; 2];

let buffer = &mut [IoSliceMut::new(buffer_0), IoSliceMut::new(buffer_1)];

loop {
reader
.read_vectored(buffer)
.expect("Error reading from file");
do_something(buffer_0, buffer_1);
}
}

出现如下编译错误:

error[E0502]: cannot borrow `*buffer_0` as immutable because it is also borrowed as mutable
--> src/main.rs:21:22
|
15 | let buffer = &mut [IoSliceMut::new(buffer_0), IoSliceMut::new(buffer_1)];
| -------- mutable borrow occurs here
...
19 | .read_vectored(buffer)
| ------ mutable borrow later used here
20 | .expect("Error reading from file");
21 | do_something(buffer_0, buffer_1);
| ^^^^^^^^ immutable borrow occurs here

buffer_1 当然也是如此。

我不明白为什么这段代码在循环内被认为是不安全的。另外,是否可以在不移动 buffer 声明的情况下使其安全?

非常感谢 Rust 专家的智慧 :)

最佳答案

在第一个示例中,buffer 的每个实例仅持续循环的一次迭代。由于非词法生命周期,编译器可以计算出您在调用 read_vectored 后不会重用那些 IoSliceMut 实例,因此它们持有的可变借用是发布,代码编译。

在您的第二个示例中,您明确表示 IoSliceMut 的这两个实例应该在整个循环中保留,并且它们应该用于每个调用read_vectored - 因此他们的可变借用不可能在最后一次迭代之前释放。

关于rust - 为什么只有在声明在循环之外时才会发生这种不变性错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57074508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com