当我查看 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
传递了所有权,但我什至可以在调用 take
后使用 file
,所以所有权显然保留在 中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
上实现(impl 甚至列在您链接到的页面上)。对于那个暗示,Self
类型是 &File
, 所以 它的 take
方法采用引用。
关于rust - 为什么我可以在引用上调用 File.take()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31503429/