从循环内部将借入的值存储到外部作用域中的容器?

for*_*emo 5 rust

我为自己设定了一项小任务,以获取一些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)

据我了解,这是因为“文本”的生存期仅限于循环的范围。因此,我在循环内提​​取的键值对也绑定到循环边界。因此,将它们插入外部地图将导致指针悬空,因为“文本”将在每次迭代后销毁。(如果我错了,请告诉我)

最大的问题是:如何解决这个问题?

我的直觉说:

创建键值对的“拥有副本”,并将其生命周期“扩展”到外部范围..但是我不知道如何实现这一目标。

She*_*ter 3

“text”的生命周期仅限于循环范围。因此,我在循环中提取的键值对也绑定到循环边界。因此,将它们插入到外部映射将导致悬空指针,因为“文本”将在每次迭代后被销毁。

对我来说听起来不错。

制作键值对的“拥有副本”。

拥有的&strString

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)