在Loop内返回选项

时间:2016-11-20 20:20:33

标签: while-loop return rust

该程序旨在使用循环来检查迭代器变量的索引是否满足特定条件(例如,索引== 3)。如果找到所需的索引,请返回Some(123),否则返回None

fn main() {
    fn foo() -> Option<i32> {
        let mut x = 5;
        let mut done = false;

        while !done {
            x += x - 3;

            if x % 5 == 0 {
                done = true;
            }

            for (index, value) in (5..10).enumerate() {
                println!("index = {} and value = {}", index, value);

                if index == 3 {
                    return Some(123);
                }
            }
            return None; //capture all other other possibility. So the while loop would surely return either a Some or a None
        }
    }
}

编译器给出了这个错误:

error[E0308]: mismatched types
  --> <anon>:7:9
   |
7  |         while !done {
   |         ^ expected enum `std::option::Option`, found ()
   |
   = note: expected type `std::option::Option<i32>`
   = note:    found type `()`

我认为错误源可能是while循环评估为(),因此它将返回()而不是Some(123)。我不知道如何在循环中返回有效的Some类型。

1 个答案:

答案 0 :(得分:4)

任何while true { ... }表达式的值始终为()。因此编译器希望您的foo返回Option<i32>,但会发现foo正文中的最后一个值为()

要解决此问题,您可以在原始return None循环之外添加while。您也可以像这样使用loop结构:

fn main() {

    // run the code
    foo();

    fn foo() -> Option<i32> {
        let mut x = 5;

        loop {
            x += x - 3;

            for (index, value) in (5..10).enumerate() {
                println!("index = {} and value = {}", index, value);

                if index == 3 {
                    return Some(123);
                }
            }
            if x % 5 == 0 {
                return None;
            }
        }
    }
}

while true { ... }语句的行为可能有点古怪,并且有change it.的一些请求