gpt4 book ai didi

rust - 不能借用 foo 作为不可变的,因为它也被借用为可变的

转载 作者:行者123 更新时间:2023-11-29 07:50:24 26 4
gpt4 key购买 nike

我有以下(足够天真)Rust 代码:

let file = &Path(some_file_name);
let mut buf = [0u8, ..12];
match io::file_reader(file) {
Ok(reader) => reader.read(buf, buf.len()),
Err(msg) => println(msg)
}

rustc 提示

cannot borrow buf[] as immutable because it is also borrowed as mutable

如果把相应的行改成:

Ok(reader) => reader.read(buf, 12),

一切都会好起来的。但它不太令人满意,因为现在缓冲区的长度在代码中重复了。虽然模糊地理解为什么 rustc 会提示,但我仍然想争辩说 rustc 应该能够推断出 len() 是一个纯函数并且没有副作用,所以代码是有效的。此外,以这种方式读入缓冲区是一种很常见的模式。

那么这里惯用的 Rust 方式是什么?

编辑:该代码适用于 Rust 0.8。正如@pnkfelix 指出的那样,Reader.read API 从那时起就发生了变化。它不再需要第二个参数。

最佳答案

这个答案是针对我的 rustc 版本的:rustc 0.9-pre (61443dc 2013-12-01)

  1. Reader trait 的当前版本与您列出的版本有不同的界面。它不再采用输出缓冲区(的一部分)和长度,而是只采用输出缓冲区的(一部分)。它可以从切片中获取输出缓冲区的长度,因此您无需重复。

  2. Rust 提示的原因是它试图确保您没有内存的读/写别名。它试图阻止您将 buf 的不可变借用传递到一个上下文中,并将 buf 的可变借用传递到另一个上下文中。

    • 当您说 len() 是纯函数时,我认为您的意思是它不会写入任何可变状态。但是,在一般情况下,它可能是读取可变状态。 (这里不是这种情况,因为我们正在处理一个固定大小的缓冲区。但是,一般来说,我们仍然可以想象我们正在处理一些自动调整大小的数组抽象。)

    • 所以有一种效果,就是人们不常想到的一种效果:阅读。

    • 我怀疑处理您看到的问题的惯用方法(忽略 API 已更改的事实)是避免重叠借用 buf,例如像这样:

      Ok(reader) => { 让 l = buf.len(); reader.read(buf,l)},

这样,您就不会重复自己;您只是提供了两个不重叠的范围,其中 buf 以不同的方式借用。

关于rust - 不能借用 foo 作为不可变的,因为它也被借用为可变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20478664/

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