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

问题描述 投票:0回答:1

当我查看

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)

file rust immutability borrow-checker
1个回答
6
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.