gpt4 book ai didi

rust - 在遍历 Vec 时进行解构

转载 作者:行者123 更新时间:2023-11-29 08:14:35 29 4
gpt4 key购买 nike

我有一个名为 Token 的枚举(你能猜出我要构建什么吗?:P)

它看起来很像这样:

enum Token {
Paren(String),
Number(String),
Name(String),
}

现在,我有一个具有以下签名的函数:

fn tokenizer(input: String) -> Vec<Token>

我没有理由相信它基本上不起作用,所以我显然有一个 Vec<Token> .

现在,在我的主要功能中我有这个:

let tokens = tokenizer("(add 44 5)".to_owned());

我想做一些类似的事情:

let mut iter = tokens.iter();
while let Some(token) = iter.next() {
match token {
Token::Paren(p) => println!("Token::Paren({})", p),
Token::Number(p) => println!("Token::Number({})", p),
Token::Name(p) => println!("Token::Name({})", p),
}
}

但很明显借贷检查员不会让我这么容易下车。

执行此操作的正确方法是什么?显然,正如您希望从这个项目的性质中看出的那样,我只是想学习 Rust,所以任何建议都会有所帮助,即使它与问题没有直接关系。 =)

最佳答案

您的枚举拥有传入的字符串,因此解构它们将尝试按值捕获它们(并将其移出枚举)。

您可以通过使用 ref p 解决此问题,同时解构以通过引用捕获...停止移动。

match *token {
Token::Paren(ref p) => println!("Token::Paren({})", p),
Token::Number(ref p) => println!("Token::Number({})", p),
Token::Name(ref p) => println!("Token::Name({})", p),
}

Working sample on the Playpen

请注意,您还需要取消引用 token ,因为您正在使用 iter() 返回对向量中 token 的引用。如果您使用 into_iter(),它会转移所有权,您可以匹配非引用。但是您的 tokens 变量现在随着值的移动而损坏。

关于rust - 在遍历 Vec<Enum(String)> 时进行解构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36490526/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com