我为自己设定了一项小任务,以获取一些Rust基本知识。任务是:
从stdin读取一些键-值对,并将它们放入哈希图中。
然而,事实证明这是比预期更棘手的挑战。主要是由于对一生的理解。下面的代码是经过几次实验后我目前拥有的,但是编译器并没有停止对我大喊大叫。
use std::io;
use std::collections::HashMap;
fn main() {
let mut input = io::stdin();
let mut lock = input.lock();
let mut lines_iter = lock.lines();
let mut map = HashMap::new();
for line in lines_iter {
let text = line.ok().unwrap();
let kv_pair: Vec<&str> = text.words().take(2).collect();
map.insert(kv_pair[0], kv_pair[1]);
}
println!("{}", map.len());
}
Run Code Online (Sandbox Code Playgroud)
编译器基本上说:
`text` does not live long enough
Run Code Online (Sandbox Code Playgroud)
据我了解,这是因为“文本”的生存期仅限于循环的范围。因此,我在循环内提取的键值对也绑定到循环边界。因此,将它们插入外部地图将导致指针悬空,因为“文本”将在每次迭代后销毁。(如果我错了,请告诉我)
最大的问题是:如何解决这个问题?
我的直觉说:
创建键值对的“拥有副本”,并将其生命周期“扩展”到外部范围..但是我不知道如何实现这一目标。
“text”的生命周期仅限于循环范围。因此,我在循环中提取的键值对也绑定到循环边界。因此,将它们插入到外部映射将导致悬空指针,因为“文本”将在每次迭代后被销毁。
对我来说听起来不错。
制作键值对的“拥有副本”。
拥有的&str
是String
:
map.insert(kv_pair[0].to_string(), kv_pair[1].to_string());
Run Code Online (Sandbox Code Playgroud)
编辑
原始代码如下,但我已更新上面的答案以使其更惯用
map.insert(String::from_str(kv_pair[0]), String::from_str(kv_pair[1]));
Run Code Online (Sandbox Code Playgroud)