gpt4 book ai didi

rust - 如何从函数返回具有 String 类型字段的结构 Vec?

转载 作者:行者123 更新时间:2023-12-03 11:41:56 25 4
gpt4 key购买 nike

我正在开发具有 lex 功能的词法分析器这应该将扫描标记的向量 move 到主程序,然后生成解析器来解析标记,定义如下:

/// ### lex
/// Pushes the tokens generated by
/// `scan_token` to `self.tokens`
fn lex(&mut self) -> Vec<Token> {
while !Self::is_at_eof(self) {
self.lexeme_start = self.lookahead;
self.tokens.push(Self::scan_token(self).unwrap());
}
self.tokens
.push(Token::new(TokenType::EOF, String::from(""), self.row));
self.tokens
}

向量 self.tokens: Vec<Token>应包含定义为的标记
pub struct Token {
// -- snip of copyable fields --
lexeme: String, // <-- the issue
// -- snip of copyable fields --
}

但是,这不会编译,因为 String类型未实现 Copy特征。在将所有权传递给函数调用者(如 move 它)时,我如何返回这个向量?

我知道这个函数不是公开的,所以它不能被模块外的任何东西调用,但是一旦我成功测试它就会调用它。

最佳答案

However, this will not compile, as the String type does not implement the Copy trait. How might I return this vector while passing ownership to the function caller (as in move it)?



你……不能吗?这真的没有意义,为什么你们都将 token 流存储在 self 上并返回它?一个或另一个是有意义的(毕竟,如果调用者愿意,调用者可以从标记器中获取标记)。或者,如果您希望能够出于某种原因链接调用,您可以返回对 Self 所拥有的 token 流的引用。是。
/// Option 0: return a reference to the Vec (could be mutable, so you could push into it)
fn lex0(&mut self) -> &Vec<Token> {
while !self.is_at_eof() {
self.lexeme_start = self.lookahead;
self.scan_token();
}
self.tokens.push(Token::new(TokenType::EOF, String::from(""), self.row));
&self.tokens
}
/// Option 1: return a slice reference (could be mutable, couldn't push into it)
fn lex1(&mut self) -> &[Token] {
while !self.is_at_eof() {
self.lexeme_start = self.lookahead;
self.scan_token();
}
self.tokens.push(Token::new(TokenType::EOF, String::from(""), self.row));
&self.tokens
}

或者,采取 self按值(value)消耗它,这样您就可以将 token 移出 self当你摧毁后者。
/// Option 2: consume lexer and return tokens stream
fn lex2(mut self) -> Vec<Token> {
while !self.is_at_eof() {
self.lexeme_start = self.lookahead;
self.scan_token();
}
self.tokens.push(Token::new(TokenType::EOF, String::from(""), self.row));
self.tokens
}

最后你可以实现 CloneToken并克隆整个 Vec 以返回它,但这似乎效率低下。
#[derive(Clone)]
struct Token {...}

/// Option 3: copy tokens stream
fn lex3(&mut self) -> Vec<Token> {
while !self.is_at_eof() {
self.lexeme_start = self.lookahead;
self.scan_token();
}
self.tokens.push(Token::new(TokenType::EOF, String::from(""), self.row));
self.tokens.clone()
}

不知道潜在需求是什么,很难提供好的建议。

关于rust - 如何从函数返回具有 String 类型字段的结构 Vec?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61885354/

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