Rust 处理移动和引用组合模式的策略有哪些,而没有特性(move_ref_pattern)或mem::replace?

Rust 处理移动和引用组合模式的策略有哪些,而没有特性(move_ref_pattern)或mem::replace?,rust,Rust,除了使用功能#![功能(移动参考模式)],处理模式中移动和参考匹配的策略是什么 通常,我有一个例程,通过引用传入参数,通过移动传入参数。我想在它们之间匹配一个元组,因为这样我更容易看到不同的组合。同时,我想适当地使用第二个参数中的内存,因为它已经属于例程了 目前,我处理它的方法是匹配一个可变引用,然后调用std::mem::replace来访问该值。这让我觉得很笨拙,我想看看是否有更好的方法来处理这件事 structF64用于防止在本示例中调用Copy: //可克隆但不可复制的浮点类型 #[派生

除了使用功能
#![功能(移动参考模式)]
,处理模式中移动和参考匹配的策略是什么

通常,我有一个例程,通过引用传入参数,通过移动传入参数。我想在它们之间匹配一个元组,因为这样我更容易看到不同的组合。同时,我想适当地使用第二个参数中的内存,因为它已经属于例程了

目前,我处理它的方法是匹配一个可变引用,然后调用
std::mem::replace
来访问该值。这让我觉得很笨拙,我想看看是否有更好的方法来处理这件事

struct
F64
用于防止在本示例中调用
Copy

//可克隆但不可复制的浮点类型
#[派生(克隆、调试)]
枚举MyFloat{
零,,
数量(F64),
}
#[派生(克隆、调试)]
结构F64(F64);
//消耗y,但不消耗x
fn my_add(x:&MyFloat,mut y:MyFloat)->MyFloat{
匹配(x和y){
(MyFloat::Zero,MyFloat::Zero)=>MyFloat::Zero,
(MyFloat::Zero,y@MyFloat::Num())=>std::mem::replace(y,MyFloat::Zero),
(MyFloat::Num(41;),MyFloat::Zero)=>x.clone(),
(MyFloat::Num(x),MyFloat::Num(y))=>{
设y=std::mem::replace(y,F64(0));
MyFloat::Num(我的添加驱动程序(x,y))
}
}
}
fn我的添加驱动程序(x:&F64,y:F64)->F64{
F64((*x).0+y.0)
}
//运行程序
fn main(){
设x=MyFloat::Num(F64(1.2));
设y=MyFloat::Num(F64(2.3));
println!(“{:?}+{:?}={:?}”,x,y.clone(),my_add(&x,y));
}

这里,
y
作为可变引用传递到匹配中,这解决了模式匹配的移动引用问题。但是,我们必须使用
std::mem::replace
提取它的内存。有没有更好的方法来处理这个问题?

您可以这样稍微简化一下:

fn my\u添加(x:&MyFloat,y:MyFloat)->MyFloat{
//按值匹配y,而不是按引用匹配:
匹配(x,y){
(MyFloat::Zero,MyFloat::Zero)=>MyFloat::Zero,
(MyFloat::Zero,y@MyFloat::Num())=>y,
(MyFloat::Num(41;),MyFloat::Zero)=>x.clone(),
(MyFloat::Num(x),MyFloat::Num(ref mut y))=>{
设y=std::mem::replace(y,F64(0));
MyFloat::Num(我的添加驱动程序(x,y))
}
}
}
要摆脱另一个
mem::replace()
调用,只能使用
move\u ref\u pattern
功能,或者使用类似以下的帮助器方法:

impl MyFloat{
fn as_ref_选项(&self)->选项{
匹配自我{
MyFloat::Zero=>None,
MyFloat::Num(f)=>Some(f),
}
}
}
//消耗y,但不消耗x
fn my_add(x:&MyFloat,y:MyFloat)->MyFloat{
匹配(x.as\u ref\u option(),y){
(无,MyFloat::Zero)=>MyFloat::Zero,
(无,y@MyFloat::Num())=>y,
(Some(41;,MyFloat::Zero)=>x.clone(),
(一些(x,MyFloat::Num(y))=>MyFloat::Num(我的添加驱动程序(x,y)),
}
}

您可以将其稍微简化如下:

fn my\u添加(x:&MyFloat,y:MyFloat)->MyFloat{
//按值匹配y,而不是按引用匹配:
匹配(x,y){
(MyFloat::Zero,MyFloat::Zero)=>MyFloat::Zero,
(MyFloat::Zero,y@MyFloat::Num())=>y,
(MyFloat::Num(41;),MyFloat::Zero)=>x.clone(),
(MyFloat::Num(x),MyFloat::Num(ref mut y))=>{
设y=std::mem::replace(y,F64(0));
MyFloat::Num(我的添加驱动程序(x,y))
}
}
}
要摆脱另一个
mem::replace()
调用,只能使用
move\u ref\u pattern
功能,或者使用类似以下的帮助器方法:

impl MyFloat{
fn as_ref_选项(&self)->选项{
匹配自我{
MyFloat::Zero=>None,
MyFloat::Num(f)=>Some(f),
}
}
}
//消耗y,但不消耗x
fn my_add(x:&MyFloat,y:MyFloat)->MyFloat{
匹配(x.as\u ref\u option(),y){
(无,MyFloat::Zero)=>MyFloat::Zero,
(无,y@MyFloat::Num())=>y,
(Some(41;,MyFloat::Zero)=>x.clone(),
(一些(x,MyFloat::Num(y))=>MyFloat::Num(我的添加驱动程序(x,y)),
}
}

看起来您已经找到了使用
move\u ref\u模式的良好直观但不稳定的方法,以及当前使用
std::mem::replace的不太好的解决方法。现在还不清楚为什么你会期望第三种方式存在。看起来你已经找到了使用
move\u ref\u pattern
的好方法和直观但不稳定的方法,以及当前使用
std::mem::replace
的不太好的解决方法。不清楚为什么你会期望第三种方式存在。