当我查看File
's docs时,我发现take
方法需要self
,而不是&self
。但是我仍然可以在借用的参考文献中调用该方法:
fn foo(file: &File) {
let _ = file.take(1); // why does this work?
println!("can still use the file: {:?}", file);
}
我认为self
通过了所有权,但我甚至可以在致电file
后使用take
,因此所有权明确地保留在foo
内。
如果我自己在使用方法的自定义结构上执行此操作,则不起作用:
struct Foo;
impl Foo {
fn foo(self: Foo) { }
}
fn main() {
let foo = &Foo;
foo.foo(); // error: cannot move out of borrowed content
}
这是完全可以预料的。
同样根据文档,File
并没有实现任何特殊的特征,据我所知。引起我注意的是Read
有一个by_ref()
方法,但我还没有称之为一切仍然有效。
这里发生了什么? (使用rustc 1.3.0-dev)
答案 0 :(得分:5)
take
方法来自Read
特征。该特征在File
上实现,因此有一个方法File::take(self, u64) -> Take<Self>
,但该特征也在&File
上实现(impl甚至列在您链接的页面上)。对于该impl,Self
类型为&File
,因此其 take
方法需要参考。