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

use*_*064 10 rust

我找到了这个,但无法让我的代码工作.我仍然怀疑我需要ref某种方式.

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

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


我开始没有灵活的数据类型,并提出了这个 hashmap映射ints(在这种情况下是列标签)到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]}
}
Run Code Online (Sandbox Code Playgroud)

为了实现灵活的数据类型,enum似乎是一个不错的开始,所以这是我开始的地方,但我坚持实施.

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 :(
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*gan 12

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

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

在模式中ref mut需要一个可变引用,即使是&mut取消引用可变引用.

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