首页 文章

从父iter()中访问变量 . 从子iter()中映射.map在编译时抛出'error[E0597]: `x` does not live long enough''[duplicate]

提问于
浏览
0

这个问题在这里已有答案:

在Rust编程语言的summary of chapter 8中提到的第三个练习中,我有点不知所措 .

我正在尝试返回所有员工及其所属部门的列表:

let mut company: HashMap<&str, Vec<&str>> = HashMap::new();
company.insert("Dept1", vec!["user1", "user2", "user3", "user4", "user5"]);
company.insert("Dept2", vec!["user6", "user7", "user8"]);
company.insert("Dept3", vec!["user9", "user10"]);

let user_dept: Vec<(&&str, &&str)> = company
    .iter()
    .map(|x| x.1.iter().map(|z| (z, x.0)))
    .flatten()
    .collect();

println!("user_dept: {:?}", user_dept);

当我尝试编译上面的代码时,它失败并出现以下错误:

error[E0597]: `x` does not live long enough
  --> src/main.rs:11:41
   |
11 |         .map(|x| x.1.iter().map(|z| (z, x.0)))
   |                                 ---     ^   -- borrowed value needs to live until here
   |                                 |       |   |
   |                                 |       |   borrowed value only lives until here
   |                                 |       borrowed value does not live long enough
   |                                 capture occurs here

我究竟做错了什么?我以为 x 仍然可以让我这样做 .

作为一个例子,我知道它不是同一种语言,但在Scala中运行以下内容确实可以让我实现我追求的结果,并且我认为阅读可能比我上面的代码更清楚(对不起!) :

val company = Map (
  "Dept1" -> List("user1", "user2", "user3", "user4", "user5"),
  "Dept2" -> List("user6", "user7", "user8"),
  "Dept3" -> List("user9", "user10"),
)

val d: Iterable[(String, String)] = company.map(a =>
  a._2.map(b => (b, a._1))
).flatten
println(s"user_dept: ${d}")

在Rust版本中有什么我错过的吗?

1 回答

  • 0

    这就是我如何解决这个问题:

    let mut company: HashMap<&str, Vec<&str>> = HashMap::new();
    company.insert("Dept1", vec!["user1", "user2", "user3", "user4", "user5"]);
    company.insert("Dept2", vec!["user6", "user7", "user8"]);
    company.insert("Dept3", vec!["user9", "user10"]);
    
    let user_dept: Vec<_> = company
        .iter()
        .flat_map(|(&dept, users)| users.iter().zip(repeat(dept)))
        .collect();
    
    println!("user_dept: {:?}", user_dept);
    

    你可以看到我使用了 flat_map() 而不是 map().flatten() ,因为这个可以更高效,而且肯定是更惯用的 . 其他变化是我使用 zip()repeat() 而不是 map() . 感谢编译器能够理解 deptusers 值的存活时间相同 .

相关问题