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

标签 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 传递了所有权,但我什至可以在调用 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/

相关文章:

json - 为什么在尝试使用 serde_json 解析数据时总是出现 "trailing characters"错误?

rust - 如何从 `Box` 中获取拥有的值?

Rust - 特征绑定(bind)取决于特征?

rust - 从 NaiveDateTime 转换为 DateTime<Local>

multithreading - 如何使用 Condvar 来限制多线程?

rust - 在 Rust 中创建一个连接 HashMap 键的字符串

rust - 从匹配语句中赋值

rust - 如何使方法流不可知?

rust - 如何从 HashMap.get 的 None 案例中返回一些东西?

rust - 如何从 Rust 中的同级文件夹导入文件