我正在构建一个玩具编译器,并有以下代码:
pub fn next_token(&mut self) -> Token {
let mut token_option = self.get_longest_match();
while let None = token_option {
token_option = self.get_longest_match();
}
let token = token_option.unwrap();
token
}
字符串get_longest_match
返回一个Option<Token>
,如果我们遇到空白,它可能是None
(我也承认这不是一个很好的处理方式,但这不是这个问题的重点)。然后我们循环,直到找到不是None
的东西(其中包括一个代币)对我来说,最大的问题是这个unwrap
调用。似乎我在网上能找到的任何地方都考虑不对一个None
值不好,但在这种情况下,它不应该是None
。
那么,这是人们通常在生产中看到的东西,还是在Rust中有更好的方法来解决这个问题?
1条答案
按热度按时间kqlmhetl1#
你的代码很好。那个
unwrap
调用是丑陋的,但是在这种情况下你不应该太担心它:确实有一些情况是不可能表达一个特定的值是可证明的Some(_)
。在生产代码中,你应该在那里放一个注解,解释为什么unwrap
调用永远不应该恐慌。但在这种情况下,你实际上可以做得更好:
字符串
请注意,如果你不想在找到标记时从函数返回,这也可以工作:你可以用“返回值”来打断
loop
s:型