enums - Rust:在没有其他模式匹配的情况下获得枚举值的所有权

标签 enums rust match

问题在评论中。 Expensive是未实现Copy的结构,或者复制太昂贵。
更新:用用户枚举Option替换Internal

enum Internal {
    Type1(Expensive),
    Type2(String),
    Empty,
}

struct Foo {
    value: Internal,
}

impl Foo {
    fn exec(&mut self) -> Result<Expensive, String> {
        if let Internal::Type1(_) = &self.value {
            let value = std::mem::take(&mut self.value);
            
            // QUESTION: how do I avoid this pattern matching since we know the value must be Internal::Type1
            return match value {
                Internal::Type1(e) => Result::Ok(e),
                _ => Result::Err(String::from("Impossible")),
            };
        }

        // Some other logic that will use self.value
    }
}

最佳答案

您可以利用 Option::take 使代码更短:

if let Option::Some(value) = self.value.take() {
    return Ok(value);
}

关于enums - Rust:在没有其他模式匹配的情况下获得枚举值的所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64761331/

相关文章:

swift - 开关 : Enum Switch issue : Not member of a int

pointers - Box,ref和&和*之间的理解和关系

reflection - 如何从 Rust 函数内部检查它是直接调用还是由 C# 代码中的 Invoke() 调用?

rust - 如何在 Rust 的 for 循环中使用 self

r - 匹配并计算 R 中的数据矩阵

java - 功能或错误 : unable to override enum method with default implementation of UnsupportedOperationException

c# - 通过自定义属性获取枚举(通用)

return - 除了一种情况外,在所有情况下匹配返回直接输入

python - 计算 pandas 数据帧行对中的匹配数

enums - 比较枚举变体而不指定里面的内容