File
的文档时,我发现 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)
take
方法来自Read
特征。该特征是在 File
上实现的,因此有一个方法 File::take(self, u64) -> Take<Self>
,但该特征也在 &File
上实现(该实现甚至列在您链接到的页面上)。对于该实现, Self
类型是 &File
,因此 its take
方法需要引用。