我有以下(非常简单的)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
提示错误:
无法将
buf[]
作为不可变的借用,因为它也被作为可变的借用
如果将相应行更改为:
Ok(reader) => reader.read(buf, 12),
所有东西都能正常工作。但是,由于现在缓冲区的长度在代码中重复出现,因此这种方法不太令人满意。虽然我隐约知道为什么 rustc
抱怨,但我仍然想争论一下,认为 rustc
应该能够推断出 len()
是一个纯函数且没有副作用,因此代码是有效的。此外,按照那种方式读取缓冲区是相当常见的模式。
那么,在 Rust 中,什么是惯用的方式呢?
编辑:代码是针对 Rust 0.8 编写的。正如 @pnkfelix 指出的那样,Reader.read
API 自那时起已经发生了变化。它不再需要第二个参数。
~Path
为Path
分配了一个盒子,而我们可以直接将Path
放在栈上并取一个普通的引用,例如&Path
。 - huon&Path
会更好。 - edwardw