fn fn1() -> Option<i32> {
Some(1)
}
fn fn2() -> Option<i32> {
Some(2)
}
fn fn3() -> Option<i32> {
Some(3)
}
fn main() {
let result = fn1()
.and_then(|x| fn2().map(|y| x + y))
.and_then(|xy| fn3().map(|z| xy + z));
match result {
Some(sum) => println!("The sum is: {}", sum),
None => println!("One of the functions returned None"),
}
}
Option枚举相关方法原理
and_then
方法:
and_then
是Option
枚举的一个方法。它接受一个闭包作为参数。
- 如果
Option
的值是Some
,则会调用闭包,并将Some
内部的值作为参数传递给闭包。闭包返回的结果必须也是Option
类型。如果闭包返回Some
,and_then
会返回这个Some
;如果闭包返回None
,and_then
也会返回None
。
- 如果
Option
的值是None
,and_then
不会调用闭包,直接返回None
。这就实现了只要有一个函数返回None
,整个操作链就立即返回None
的需求。
map
方法:
map
也是Option
枚举的方法。它接受一个闭包作为参数。
- 如果
Option
的值是Some
,则会调用闭包,并将Some
内部的值作为参数传递给闭包,然后将闭包的返回值包装在Some
中返回。如果Option
的值是None
,map
不会调用闭包,直接返回None
。这里使用map
是为了对Some(T)
中的T
类型值进行累加操作,并保持Option
类型。