当我查看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方法需要参考.
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |