为什么我可以在引用上调用File.take()?

mus*_*iKk 4 rust

当我查看File文档时,我发现该take方法需要一个self,而不是一个&self.但是我仍然可以在借用的引用上调用该方法:

fn foo(file: &File) {
    let _ = file.take(1); // why does this work?
    println!("can still use the file: {:?}", file);
}
Run Code Online (Sandbox Code Playgroud)

我认为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
}
Run Code Online (Sandbox Code Playgroud)

这完全是预料之中的.

同样根据文档,File据我所知,没有实现任何特殊的特征.引起我注意的是Read有一种by_ref()方法,但我没有称之为一切仍然有效.

这里发生了什么?(使用rustc 1.3.0-dev)

小智 5

take方法来自Read特征.该特性是在实现的File,所以有一个方法File::take(self, u64) -> Take<Self>,但特性也实现&File(impl甚至列在你链接到的页面上).对于那个impl,Self类型是&File,所以它的 take方法需要参考.