如何在 Rust 中使用附加到结构实例的可变向量

How to work w/ mutable vector attached to a struct instance in rust

我是 Rust 的新手。我正在尝试创建一个 json 解析器,我需要一个结构实例来保存一个可变向量,该向量可以填充越来越多的项目。

这是我的代码:

#[derive(Debug, PartialEq)]
pub enum Token {
    BegKey,
    EndKey
}

#[derive(Debug)]
struct TokenData {
    token: Token,
    data: Vec<u8>
}

impl TokenData {
    fn new(token: Token, v: Option<u8>) -> Self {
        let mut data: Vec<u8> = vec![];
        for &val in v.iter() {
            data.push(val);
        }
        TokenData{token: token, data: data }
    }
}

pub fn read_json_stream(buf: &[u8], size: usize, tokens: &mut Vec<TokenData>, on_obj: fn() -> ()) {
    let mut i = 0;
    while i < size {
        let token = tokens.last();
        match token {
//           ^^^^^^^ 
// cannot move out of `token.0.data` which is behind a shared reference

// note: move occurs because these variables have types that don't implement the `Copy` traitrustc(E0507)


           Some(&TokenData{token: Token::BegKey, data: mut data}) => match buf[i] {
                b'"' if data.last() == Some(&b'\') => data.push(b'"'),
                b'"' => tokens.push(TokenData::new(Token::EndKey, None)),
                k => data.push(k),
            },
            _ => {}
        }
      i += 1;
    }
}

你想要的是最后一项,但 拥有 Option<T>,为此使用 pop 而不是 last(returns 一个 Option<&T>):

let token = tokens.pop();

Playground

您需要使用 .last_mut() 来获取可变引用。然后从 match 手臂上取下 &mut data,让 match ergonomics 处理其余部分:

let token = tokens.last_mut();
match token {
    Some(TokenData { token: Token::BegKey, data }) => ...

Playground