在 rust 中从 type::new() 调用函数

问题描述 投票:0回答:1

我在 Go 中有以下代码,我想用 Rust 重写:

func New(l *lexer.Lexer) *Parser {
    p := &Parser{l: l}
    // Read two tokens, so curToken and peekToken 
    // are both set
    p.nextToken()
    p.nextToken()
    return p
}
func (p *Parser) nextToken() {
    p.curToken = p.peekToken
    p.peekToken = p.l.NextToken()
}

在 Rust 中,我有以下内容:

struct Parser {
    l: lexer::Lexer,
    cur_token: lexer::Token,
    peek_token: lexer::Token,
}
impl Parser {
    fn new(l: lexer::Lexer, cur_token: lexer::Token, peek_token: lexer::Token) -> Self {
        Self {
            l: l,
            cur_token: cur_token,
            peek_token: peek_token,
        }
    }
    fn init(&mut self) {
        self.next_token();
        self.next_token();
    }
    fn next_token(&mut self) {
        self.cur_token = self.peek_token;
        self.peek_token = self.l.next_token();
    }
}

这是用 Rust 编写代码的最佳方式吗?

parsing rust
1个回答
0
投票

您在 Rust 中要做的唯一更改是在构造

Parser
之前检索前两个标记,因为值不能为空。无需将
new
分成两个函数或采用额外的参数。

fn new(mut l: lexer::Lexer) -> Self {
    let cur_token = l.next_token();
    let peek_token = l.next_token();
    Self {
        l,
        cur_token,
        peek_token,
    }
}

如果您必须确保调用

Parser::next_token
,您可以使用临时值初始化
Parser
。选择哪个值并不重要,只要它们有效即可,但这里我使用
Token::default

fn new(l: lexer::Lexer) -> Self {
    let mut parser = Self {
        l,
        cur_token: lexer::Token::default(),
        peek_token: lexer::Token::default(),
    };
    parser.next_token();
    parser.next_token();
    parser
}
© www.soinside.com 2019 - 2024. All rights reserved.