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
”我更新了代码。枚举有两个以上的变量,我只想在它与一个变量匹配时使用它。我更新了代码。枚举有两个以上的变量,我只想在它与一个变量匹配时使用它。