该程序旨在使用循环来检查迭代器变量的索引是否满足特定条件(例如,索引== 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
类型。
答案 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.的一些请求