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

Joe*_*Joe 6 ownership rust

我正在阅读有关生命周期的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();
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

这是因为该fun(self)方法取得了s实例的所有权.这可以通过改为来解决fun(&self).

我不明白为什么你想要一个对象的方法控制自己.我只能想到一个例子,一个main方法,但如果你想处理这个对象,那么无论如何它都会由对象的所有者来处理(即fun(self)本例中的范围).

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

Nou*_*tes 7

在rust std doc中引用"控制"self的方法的惯用方法是说它"消耗"它.如果你谷歌这个,你可能会找到一些例子:

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


A.B*_*.B. 6

从类型 A 到类型 B 的转换通常涉及按值获取 self 的函数。有关具体示例,请参阅IntoFromtrait的实现者。