rust 如何反复调用函数直到它返回Some并避免.unwrap()?

1hdlvixo  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(134)

我正在构建一个玩具编译器,并有以下代码:

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中有更好的方法来解决这个问题?

kqlmhetl

kqlmhetl1#

你的代码很好。那个unwrap调用是丑陋的,但是在这种情况下你不应该太担心它:确实有一些情况是不可能表达一个特定的值是可证明的Some(_)。在生产代码中,你应该在那里放一个注解,解释为什么unwrap调用永远不应该恐慌。
但在这种情况下,你实际上可以做得更好:

pub fn next_token(&mut self) -> Token {
    loop{
        if let Some(token) = self.get_longest_match() {
            return token;
        }
    }
}

字符串
请注意,如果你不想在找到标记时从函数返回,这也可以工作:你可以用“返回值”来打断loop s:

pub fn next_token(&mut self) -> Token {
    let token = loop{
        if let Some(token) = self.get_longest_match() {
            break token;
        }
    };

    token
}

相关问题