我有以下(无辜)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)
}
Run Code Online (Sandbox Code Playgroud)
该rustc
抱怨
不能借用
buf[]
不可变的因为它也被借用为可变的
如果将相应的行更改为:
Ok(reader) => reader.read(buf, 12),
Run Code Online (Sandbox Code Playgroud)
一切都会好起来的.但它不太令人满意,因为现在缓冲区的长度在代码中重复.虽然模糊地理解为什么rustc
抱怨,但我仍然认为rustc
应该能够推断出这len()
是一个纯粹的函数并且没有副作用,所以代码是有效的.此外,以这种方式读取缓冲区是一种非常常见的模式.
那么这里惯用的Rust方式是什么?
编辑:代码是为Rust 0.8.正如@pnkfelix指出的那样,Reader.read
API从那时起就发生了变化.它不再需要第二个参数.
这个答案适用于我的rustc版本:rustc 0.9-pre(61443dc 2013-12-01)
Reader trait的当前版本具有与您列出的不同的界面.它不是同时取一个(一片)输出缓冲区和一个长度,而是只需要(一片)输出缓冲区.它可以从切片中获取输出缓冲区的长度,因此您无需重复自己.
Rust抱怨的原因是它试图确保你没有内存的读/写别名.它试图阻止你将不可变借用传递buf
到一个上下文中,并将可变借用传递buf
到另一个上下文中.
当你说len()
是纯函数时,我认为它意味着它不会写入任何可变状态.但是,在一般情况下,它可能是读取可变状态.(这不是这里的情况,因为我们正在处理一个固定大小的缓冲区.但是,通常可以想象我们正在处理一些自动调整大小的数组抽象.)
所以有一种效果,只是一种人们通常不会想到的:阅读的效果.
我怀疑处理你看到的问题的惯用方法(忽略API已经改变的事实)将避免重叠借用buf
,例如:
Ok(reader) => { let l = buf.len(); reader.read(buf, l) },
这样,你不要重复自己; 你只是提供两个不重叠的范围,buf
以不同的方式借用.
归档时间: |
|
查看次数: |
2004 次 |
最近记录: |