你如何在比赛中借用一个可变参考?

时间:2015-04-15 23:32:08

标签: rust

我找到this但无法让我的代码正常工作。我仍然怀疑我需要ref某种方式。

我正在尝试在Rust中创建一个合理的Table类来了解有关该语言的更多信息,并在理解借用检查器和可变性概念以及它们相应的语法时遇到一些麻烦。

我希望表类具有灵活性,并允许列中的数据类型是同构的不同列类型。所以,一列整数,浮点数,字符串等。


我开始时没有灵活的数据类型,并提出了this hashmap映射整数(在这种情况下为列标签)到int的向量(列中的数据)。

use std::collections::HashMap; 

fn main() {
    let mut d: HashMap<isize, Vec<isize>> = HashMap::new();
    d.insert(0, Vec::new());
    d.get_mut(&0).unwrap().push(0); 

    println!("{:?}", d);
    // nice {0: [0]}
}

为了实现灵活的数据类型,enum似乎是一个不错的开始,that is where I started但我坚持实施。

use std::collections::HashMap; 

#[derive(Debug)] 
enum VT {
    A(Vec<isize>),
    B(Vec<f64>),
}

fn main() {
    let mut d: HashMap<isize, VT> = HashMap::new();
    d.insert(0, VT::A(Vec::new()));

    match d.get_mut(&0).unwrap() {
        &mut VT::A(v) => v.push(0),
        &mut VT::B(v) => v.push(0.1), // would not be reached as-is 
    } 

    println!("{:?}", d);
}
// cannot borrow immutable local variable `v` as mutable :(

最终,拥有类似于pandas的图书馆将是梦想。目前,实现表是一种很好的Rust实践。

1 个答案:

答案 0 :(得分:12)

你的匹配区应该是这样的:

match *d.get_mut(&0).unwrap() {
    VT::A(ref mut v) => v.push(0),
    VT::B(ref mut v) => v.push(0.1),
}

在模式中ref mut采用可变引用,即使&mut取消引用可变引用。

(公约也是match *foo { X => … }而不是match foo { &mut X => … },但这是一个非常小的问题。)