这个问题在这里已有答案:
在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 回答
这就是我如何解决这个问题:
你可以看到我使用了
flat_map()
而不是map().flatten()
,因为这个可以更高效,而且肯定是更惯用的 . 其他变化是我使用zip()
和repeat()
而不是map()
. 感谢编译器能够理解dept
和users
值的存活时间相同 .