我正在阅读有关生命周期的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)本例中的范围).
我的问题:为什么可以编写一个取得结构所有权的方法?有没有你想要的情况?
在rust std doc中引用"控制"self的方法的惯用方法是说它"消耗"它.如果你谷歌这个,你可能会找到一些例子:
Option::unwrap_or_default特点:https://doc.rust-lang.org/std/iter/trait.Iterator.html至于为什么:你可以尝试重写Iterator:你最终会有一个徘徊的生命周期参数很快就会变得无法管理.为什么?因为Iterator::map迭代器是基于前一个迭代器,所以借用检查器将强制您只能同时使用这两个中的一个.
| 归档时间: |
|
| 查看次数: |
666 次 |
| 最近记录: |