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

时间:2015-07-19 16:36:39

标签: rust

当我查看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)

1 个答案:

答案 0 :(得分:5)

take方法来自Read特征。该特征在File上实现,因此有一个方法File::take(self, u64) -> Take<Self>,但该特征也在&File上实现(impl甚至列在您链接的页面上)。对于该impl,Self类型为&File,因此 take方法需要参考。