Rust 为什么map和map_err捕获相同的变量?
我正在建立一个被锁住的未来Rust 为什么map和map_err捕获相同的变量?,rust,rust-actix,Rust,Rust Actix,我正在建立一个被锁住的未来 ActorFuture<Item = Vec<String>, Error = Vec<String>, Actor = Self> 为什么呢?是否可以同时进入map和map\u err?据我所知,这永远不会发生 例如: #[test] fn test_map_and_map_err() { let mut v = Vec::new(); Ok("foo".to_string()) .map(|i|
ActorFuture<Item = Vec<String>, Error = Vec<String>, Actor = Self>
为什么呢?是否可以同时进入map
和map\u err
?据我所知,这永远不会发生
例如:
#[test]
fn test_map_and_map_err() {
let mut v = Vec::new();
Ok("foo".to_string())
.map(|i| { v.push(i); v })
.map_err(|e: String| { v.push(e); v });
}
错误[E0382]:移动值的捕获:`v`
-->src/lib.rs:6:32
|
5.映射(|i{v.push(i);v})
|---值移到此处(关闭)
6.映射错误(| e:String{v.push(e);v});
|^移动后在此捕获的值
|
=注意:发生移动是因为'v'的类型为'std::vec::vec',而该类型不实现'Copy'特性
编译器不知道传递给map
和map\u err
的闭包是互斥的。即使它这样做了,它也无法构造两个具有相同值的闭包
您需要使用对编译器“透明”的构造,如match
:
#[test]
fn test_map_and_map_err() {
let mut v = Vec::new();
let r = Ok("foo".to_string())
.map(|i| v.push(i))
.map_err(|e: String| v.push(e));
match r {
Ok(()) => Ok(v),
Err(()) => Err(v),
};
}
或者,您可以将该值换出:
#[test]
fn test_map_and_map_err() {
use std::mem;
let mut v = Vec::new();
Ok("foo".to_string())
.map(|i| {
v.push(i);
mem::replace(&mut v, vec![])
}).map_err(|e: String| {
v.push(e);
mem::replace(&mut v, vec![])
});
}
“为什么?我的意思是,有可能同时进入地图和地图错误吗?”-我肯定是的。但是你没有提供足够的信息来帮助。在
match
中,我只是将逻辑移到里面:match Ok(“foo.to_string()){Ok(s)=>{v.push(s);Ok(v)}Err(e)=>{v.push(e);Err(v)}