我在生命周期中阅读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
的范围)。
为什么可以编写一个获取结构所有权的方法?有没有你想要的情况?
答案 0 :(得分:7)
在Rust标准库文档中引用“控制”self的方法的惯用方法是说它“消耗”它。如果你搜索这个,你应该找到一些例子:
至于为什么:你可以尝试重写Iterator::map
- 你最终会有一个徘徊的生命周期参数很快就会变得无法管理。为什么?因为Map
迭代器是基于前一个迭代器,所以借用检查器将强制您只能同时使用其中一个。
答案 1 :(得分:4)