如何在 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();
您需要使用 .last_mut()
来获取可变引用。然后从 match
手臂上取下 &
和 mut data
,让 match ergonomics 处理其余部分:
let token = tokens.last_mut();
match token {
Some(TokenData { token: Token::BegKey, data }) => ...
我是 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();
您需要使用 .last_mut()
来获取可变引用。然后从 match
手臂上取下 &
和 mut data
,让 match ergonomics 处理其余部分:
let token = tokens.last_mut();
match token {
Some(TokenData { token: Token::BegKey, data }) => ...