如何与Rust结构实例附加的可变矢量一起工作

发布于 01-20 07:01 字数 1318 浏览 2 评论 0原文

我是生锈的新来。我正在尝试创建一个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;
    }
}

I'm new in rust. I'm trying to create a json parser and I need a struct instance to hold a mutable vector that can be populated with more and more items.

Here is my code:

#[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;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

王权女流氓 2025-01-27 07:01:06

您需要使用 .last_mut()< /code>获取可变引用。然后从 match 手臂上移除 &mut data,让比赛人体工学负责剩下的工作:

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

游乐场

You need to use .last_mut() to get a mutable reference. Then remove & and mut data from the match arm to let match ergonomics take care of the rest:

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

Playground

同尘 2025-01-27 07:01:06

您想要的是最后一项,但是拥有 option&lt; t&gt;,对于此使用 pop 而不是last(它返回option&lt ;

let token = tokens.pop();

​“>游乐场

What you want is the last item, but owned Option<T>, for that use pop instead of last (which returns an Option<&T>):

let token = tokens.pop();

Playground

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文