什么时候实现想要在Rust中拥有自己的所有权?

时间:2016-04-10 15:29:12

标签: rust ownership

我在生命周期中阅读Rust文档。我试过像:

struct S {
    x: i8,
}

impl S {
    fn fun(self) {}

    fn print(&self) {
        println!("{}", self.x);
    }
}

fn main() {
    let s = S { x: 1 };
    s.fun();
    s.print();
}

我收到以下错误:

error[E0382]: borrow of moved value: `s`
  --> src/main.rs:16:5
   |
15 |     s.fun();
   |     - value moved here
16 |     s.print();
   |     ^ value borrowed here after move
   |
   = note: move occurs because `s` has type `S`, which does not implement the `Copy` trait

这是因为fun(self)方法取得s实例的所有权。通过更改为fun(&self)来解决此问题。

我无法理解为什么你想要一个对象的方法控制自己。我只能想到一个例子,一个析构函数方法,但如果你想处理该对象,那么无论如何它都会由对象的所有者处理(即本例中main的范围)。

为什么可以编写一个获取结构所有权的方法?有没有你想要的情况?

2 个答案:

答案 0 :(得分:7)

在Rust标准库文档中引用“控制”self的方法的惯用方法是说它“消耗”它。如果你搜索这个,你应该找到一些例子:

至于为什么:你可以尝试重写Iterator::map - 你最终会有一个徘徊的生命周期参数很快就会变得无法管理。为什么?因为Map迭代器是基于前一个迭代器,所以借用检查器将强制您只能同时使用其中一个。

答案 1 :(得分:4)

从类型A到类型B的转换通常涉及通过值自我获取的函数。有关具体示例,请参阅IntoFrom特征的实现者。