一个实现在Rust中何时希望获取self的所有权?

12

我正在阅读关于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
我只能想到一个例子,即析构函数。有趣的是,最接近析构函数的等价物采用可变引用来获取该项。 - Shepmaster
2个回答

9
在 Rust 标准库文档中,指代“控制 self”的方法的惯用方式是说它“消耗”了 self。如果你搜索这个词,你应该会找到一些例子:
- Option::unwrap_or_default - 在 Iterator trait 中很常见。
至于为什么:你可以尝试重写 Iterator::map —— 你最终会得到一个生命周期参数四处游荡的代码,很快就会变得难以管理。为什么?因为 Map 迭代器基于前一个迭代器,所以借用检查器将强制执行你只能同时使用其中之一。

6

将类型 A 转换为类型 B 通常涉及到以值传递 self 的函数。可以参考 IntoFrom 特性的实现者的具体示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接