【发布时间】:2019-03-01 20:38:33
【问题描述】:
这是一个简单的程序,它在map 中查找先前的值并将新值放入其中。它不会编译,因为第一个查找不可变地借用 map 和 insert 想要可变地借用 map。
use std::collections::HashMap;
fn main() {
let mut map: HashMap<i32, i32> = HashMap::new();
map.insert(0, 0);
(1..5).for_each(|x| {
let prev = map.get(&(x - 1)).unwrap();
map.insert(x, (prev + 1) * 10);
});
map.iter().for_each(|(k, v)| println!("{} -> {}", k, v));
}
问题可以通过使用clone() on 得到prev as
let prev = map.get(&(x - 1)).unwrap().clone();
并得到如下输出:
0 -> 0
1 -> 10
2 -> 110
3 -> 1110
4 -> 11110
我该怎么做才能不在这里使用clone()?
【问题讨论】:
-
如果不使用 NLL,请使用范围,play.integer32.com/…
-
您提供的代码compiles as-is。升级您的 Rust 版本并切换到 Rust 2018。
-
@Stargateur 能否请您将此作为答案发布,以便我将其标记为已接受的答案。
-
@Stargateur 发布的片段清楚地解释了词法生命周期如何帮助清楚地理解每个变量的使用。 Non Lexical Lifetimes (NLL) 确实有助于更轻松地编写代码,但这里的范围界定似乎是一个更好的想法和更惯用的恕我直言。
标签: rust