首页 > 解决方案 > Rust:在没有其他模式匹配的情况下获得枚举值的所有权

问题描述

问题在评论中。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
    }
}

标签: enumsrustmatch

解决方案


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

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

推荐阅读