我在 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 编写代码的最佳方式吗?
您在 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
}