需要矢量切片更长寿

时间:2017-03-04 19:40:56

标签: vector rust lifetime

有没有办法让这个矢量的切片持续足够长的时间,以便我可以在这种圆形结构中使用它们?

fn populate_chain(file_path: &str) -> HashMap<String, HashSet<&String>> {
    println!("loading...");
    let time = util::StopWatch::new();
    let mut words = HashMap::new();
    {
        let f = |mut x: Vec<String>| {
            let word = x.pop().unwrap();
            words.insert(word, HashSet::new());
        };
        Csv::process_rows(f, file_path, "\t");
    }

    let col: Vec<(String, HashSet<&String>)> = words.clone().into_iter().collect();
    let m: usize = col.len() - 1;
    for i in 0..m {
        let ref k: String = col[i].0;
        for j in i..m {
            let ref nk: String = col[j].0;
            if check_link(k, nk) {
                words.get_mut(k).unwrap().insert(nk);
                words.get_mut(nk).unwrap().insert(k);
            }
        }
    }

    time.print_time();
    words
}

我正在使用double for循环将相关的单词链接在一起,以便以后可以快速查找。

以下是编译器错误......

error: `col` does not live long enough
  --> src/main.rs:28:29
   |
28 |         let ref k: String = col[i].0;
   |                             ^^^ does not live long enough
...
40 | }
   | - borrowed value only lives until here
   |
note: borrowed value must be valid for the anonymous lifetime #1 defined on the block at 13:72...
  --> src/main.rs:13:73
   |
13 | fn populate_chain(file_path: &str) -> HashMap<String, HashSet<& String>>{
   |                                                                         ^

error: `col` does not live long enough
  --> src/main.rs:30:34
   |
30 |             let ref nk: String = col[j].0;
   |                                  ^^^ does not live long enough
...
40 | }
   | - borrowed value only lives until here
   |
note: borrowed value must be valid for the anonymous lifetime #1 defined on the block at 13:72...
  --> src/main.rs:13:73
   |
13 | fn populate_chain(file_path: &str) -> HashMap<String, HashSet<& String>>{
   |  

1 个答案:

答案 0 :(得分:0)

我可以从你的函数签名中告诉你,尝试编写这个函数会遇到很大的问题,至少如果你希望它在结果中包含非空的fn populate_chain(file_path: &str) -> HashMap<String, HashSet<&String>>

fn populate_chain<'a>(file_path: &'a str) -> HashMap<String, HashSet<&'a String>>

此函数签名中包含引用;他们已经过了一生。如果你将推断的生命周期显式化,它将如下所示:

'a

换句话说:这个函数声称,给定一些带有生命周期String的字符串切片,它会返回一个包含'a个生命周期为String的对象的集合。

但是你无法在代码中分配这样的HashSet个对象。 :(

所以,你被困住了;无论你将什么放入函数体,你都无法提供一个返回与TypedArena s相关的非平凡结果的实现。

然而,一切都不会丢失。例如,您可以修改您的函数,以便它还可以将具有适当生命周期的HashSet<String>作为附加参数,然后在那里分配字符串。另一个(更简单)选项是使用HashSet<&String>而不是$.post(chrome.extension.getURL('get_image.php'), { username: 'user' }, function(result) { console.log(result); }); ...