在同一块中借用可变和不可变引用

时间:2015-06-07 20:19:33

标签: data-structures hashmap hashtable rust

我正在尝试在Rust中实现我自己的天真HashMap / HashTable数据结构。第一步是创建Vec<&mut Bucket>类型的表格,其中type Bucket = Vec<i64>

我实际上在用数据填充表时遇到问题......我正在从输入文件中读取1 000 000个整数并将它们存储到10万个桶中。对于输入中的每个数字,我分配一个随机桶。我首先检查存储桶是否已经存在,如果存在,我将数字推入存储桶。否则,我创建存储桶并将其存储在表中。

我这样做时遇到两个问题:

第一个问题是在创建存储桶时出现错误'b' does not live long enough。如果存储区的范围结束,如何保留存储桶?

第二个问题是我正在以可变和不可变的方式借用table,但我不确定如何避免这种情况。

use std::env;
// other libs...

extern crate rand;
use rand::{thread_rng, Rng};

type Bucket = Vec<i64>;

fn main() {
    let mut rng = thread_rng();

    let mut nums = // read 1 million i64s, ie. vec![4253564645, 2394887235, ...] 
    println!("input consumed!");

    let mut table: Vec<&mut Bucket> = Vec::new();

    for x in nums.iter() { 
        let key: usize = rng.gen_range(0, 99999);
        println!("{}", key);

        if let Some(mut b) = table.get(key) { // <-- immutable borrow
            b.push(x);
        } else {
            let mut b = vec![x]; // <-- `b` does not live long enough
            table.insert(key, &mut b); //  <-- mutable borrow
        }
    }
}

如果您想运行示例,整个过程就在这里:https://gist.github.com/neektza/f96d8bf92ee66f1c1703

P.S。 我正在使用Rust 1.0.0

0 个答案:

没有答案