如何在 rust 中使用附加到 struct 实例的可变向量

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

提问人:Warlock 提问时间:4/11/2022 更新时间:4/11/2022 访问量:302

问:

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

这是我的代码:

#[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;
    }
}
向量 结构 可变

评论


答:

0赞 Netwave 4/11/2022 #1

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

let token = tokens.pop();

操场

1赞 kmdreko 4/11/2022 #2

您需要使用 .last_mut() 来获取可变引用。然后从手臂上取下,让匹配的人体工程学处理剩下的事情:&mut datamatch

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

操场