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

Enums Rust:在没有其他模式匹配的情况下获得枚举值的所有权,enums,rust,match,Enums,Rust,Match,问题在评论中昂贵是一种结构,它要么不实现复制,要么复制成本太高 更新:将选项替换为用户枚举内部 enum Internal { Type1(Expensive), Type2(String), Empty, } struct Foo { value: Internal, } impl Foo { fn exec(&mut self) -> Result<Expensive, String> { if let I

问题在评论中<代码>昂贵是一种结构,它要么不实现
复制
,要么复制成本太高

更新:将
选项
替换为用户枚举
内部

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
    }
}

enum内部{
类型1(昂贵),
类型2(字符串),
空的,,
}
结构Foo{
价值:内部,
}
impl-Foo{
fn exec(&mut self)->结果{
如果let Internal::Type1()=&self.value{
让value=std::mem::take(&mut self.value);
//问题:既然我们知道值必须是Internal::Type1,那么如何避免这种模式匹配
返回匹配值{
内部::类型1(e)=>结果::正常(e),
_=>Result::Err(字符串::from(“不可能”)),
};
}
//其他一些使用self.value的逻辑
}
}
您可以利用以下方法缩短代码:

如果let Option::Some(value)=self.value.take(){
返回Ok(值);
}
您可以利用以下方法缩短代码:

如果let Option::Some(value)=self.value.take(){
返回Ok(值);
}

您想按原样通过该对象吗?我认为std::mem::take是不必要的。如果你用
let
打开东西,你就应该得到它。如果let Option::Some(v)=self.value{return Result::Ok(v)},你不应该做
吗?@tadman我不能用“self.value”,因为self是一个可变的引用“&mut self”。好吧,你不能“take”它没有变异。@tadman这就是为什么我需要
std::mem::take
。如果let Option::Some(v)=self.value{return Result::Ok(v)}
的代码
if-let Option::Some(v)=self.value{return Result::Ok(v)}
将导致此错误:“无法移出位于可变引用后面的
self.value.0
”是否要按原样传递该对象?我认为std::mem::take是不必要的。如果你用
let
打开东西,你就应该得到它。如果let Option::Some(v)=self.value{return Result::Ok(v)},你不应该做
吗?@tadman我不能用“self.value”,因为self是一个可变的引用“&mut self”。好吧,你不能“take”它没有变异。@tadman这就是为什么我需要
std::mem::take
。您的代码
if let Option::Some(v)=self.value{return Result::Ok(v)}
将导致此错误:“无法移出位于可变引用后面的
self.value.0
”我更新了代码。枚举有两个以上的变量,我只想在它与一个变量匹配时使用它。我更新了代码。枚举有两个以上的变量,我只想在它与一个变量匹配时使用它。