gpt4 book ai didi

rust - 一次不能多次借用 `rdr` 作为可变的 [当使用 cargo 的库时]

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

运行下面的代码:

extern crate csv;  // csv = "1.0.0-beta.5"

use std::fs::File;

fn main() {
let file_path = "file.csv";
let file = File::open(file_path).unwrap();

let mut rdr = csv::ReaderBuilder::new()
.has_headers(true)
.from_reader(file);
let headers = rdr.headers().unwrap();
println!("{:?}", headers);

//println!("{:?}", rdr.headers().unwrap());

for result in rdr.records() {
let record = result.unwrap();
println!("{:?}", record);
}
}

结果:

error[E0499]: cannot borrow `rdr` as mutable more than once at a time
--> src/main.rs:17:19
|
12 | let headers = rdr.headers().unwrap();
| --- first mutable borrow occurs here
...
17 | for result in rdr.records() {
| ^^^ second mutable borrow occurs here
...
21 | }
| - first borrow ends here

error: aborting due to previous error

如果我改变这些行:

let headers = rdr.headers().unwrap();
println!("{:?}", headers);

//println!("{:?}", rdr.headers().unwrap());

以下代码有效:

//let headers = rdr.headers().unwrap();
//println!("{:?}", headers);

println!("{:?}", rdr.headers().unwrap());

同样,如果我克隆 header ,它也可以工作:

let headers = rdr.headers().unwrap().clone();
println!("{:?}", headers);

我读了一个相关的question然而,这个问题是关于用户自己编写的函数,而这个用例是函数由库提供的地方。

应该如何处理此类错误以及导致此错误的具体原因是什么?

最佳答案

如果您查看headers signature ,它是:

fn headers(&mut self) -> Result<&StringRecord>;

因此 headers() 可变地借用了 ReaderBuilder 的实例。同样适用于 records() :

fn records(&mut self) -> StringRecordsIter<R>;

这些函数的两种返回类型都包含对底层 ReaderBuilder 实例的可变引用。

根据 Rust 的 borrow rules ,您不能在同一时间拥有对同一对象的多个可变引用。

可能的缓解措施:在单独的范围内使用 headers()。因此,在调用 records() 之前删除引用。

let mut rdr = csv::ReaderBuilder::new()
.has_headers(true)
.from_reader(file);
{
let headers = rdr.headers().unwrap();
println!("{:?}", headers);
// `headers` is dropped here.
}

for result in rdr.records() {
let record = result.unwrap();
println!("{:?}", record);
}

当您clone 时不会发生错误,因为在克隆时创建并分配了另一个全新的对象。您不再有多个可变引用。

同样,当你使用println!("{:?}", rdr.headers().unwrap());时,headers()返回的值> 立即被删除,因此借用检查器不会提示多个可变引用。

函数是由库提供还是由用户创建是无关紧要的。唯一重要的是函数的签名。

关于rust - 一次不能多次借用 `rdr` 作为可变的 [当使用 cargo 的库时],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50245626/

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