实施所有权选择性消费的最佳实践是什么?

Ily*_*sov 3 rust

假设我有以下结构

struct Test {
    value : i32,
}
Run Code Online (Sandbox Code Playgroud)

我为它实现了以下方法

impl Test {
    fn take_ownership(self) -> Option<Self> {
       if self.value >= 0 {
           Some(self)
       } else {
           None
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

value我很擅长在大于 的情况下消耗所有权0,但是如何重写代码以便在None返回的情况下不消耗所有权?

Net*_*ave 6

您可以返回一个Result失败的所有权实例作为错误类型:

struct Test {
    value: i32,
}

impl Test {
    fn take_ownership(self) -> Result<i32, Self> {
       if self.value >= 0 {
           Ok(self.value)
       } else {
           Err(self)
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

操场

请注意,这仍然会消耗self,但您可以在之后恢复它。

另请记住,您以后随时可以Option获取Result

fn main() {
    let t = Test { value: 10 };
    let value = t.take_ownership().ok();
    println!("{value:?}");
}
Run Code Online (Sandbox Code Playgroud)

操场