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