Rust中Option使用细节。
分类
unwrap系列
函数 | 功能 | move | panic | evaluate |
---|---|---|---|---|
expect |
取出v 或panic |
Y | Y | N/A |
unwrap |
取出v 或panic |
Y | Y | N/A |
unwrap_or |
取出v 或默认值 |
Y | N | eagerly |
unwrap_or_else |
取出v 或默认值 |
Y | N | lazily |
map系列
函数 | 功能 | move | panic | evaluate |
---|---|---|---|---|
map |
把本Option<T> 转化成Option<U> 或None |
Y | N/A | |
map_or |
把本Option<T> 转化成U 或默认值 |
Y | eagerly | |
map_or_else |
把本Option<T> 转化成U 或默认值 |
Y | lazily |
ok系列
函数 | 功能 | move | panic | evaluate |
---|---|---|---|---|
ok_or |
把本Option<T> 转化成Result<T, E> |
Y | eagerly | |
ok_or_else |
把本Option<T> 转化成Result<T, E> |
Y | lazily |
逻辑运算系列
函数 | 功能 | move | panic | evaluate |
---|---|---|---|---|
and |
本Option 和参数optb 有一个为None 结果就为None |
Y | eagerly | |
and_then |
本Option 和参数f() 有一个为None 结果就为None |
Y | lazily | |
or |
本Option 和参数optb 有一个为Some 结果就为Some |
Y | eagerly | |
or_else |
本Option 和参数f() 有一个为Some 结果就为Some |
Y | lazily | |
xor |
本Option 和参数optb 有且只有一个为Some 结果才为Some |
Y | N/A |
细节
expect()
如果本Option
是Some
,就把值move出来;否则就以给定的msg
来panic,和unwrap
非常类似,只是panic产生的msg
不同。
1 | let o: Option<String> = Some(String::from("expect() moves the Option's value")); |
输出:
1 | expect() moves the Option's value |
unwrap()
如果本Option
是Some
,就把值move出来;否则就panic,和expect
非常类似,只是panic产生的msg
不同。
1 | let o: Option<String> = Some(String::from("unwrap() moves the Option's value")); |
输出:
1 | unwrap() moves the Option's value |
unwrap_or()
如果本Option
是Some
,就把值move出来;否则返回default
。注意:default
会被eagerly evaluated,也就是说,无论本Option
是Some
还是None
,default
都先被求值。下面的unwrap_or_else
与之相反。
1 | fn get_string() -> String { |
输出:
1 | get_string() is called |
unwrap_or_else()
如果本Option
是Some
,就把值move出来;否则返回f()
。注意:f()
会被lazily evaluated,也就是说,当且仅当本Option
是一个None
时f()
才被求值。上面的unwrap_or
与之相反。
1 | let o: Option<String> = Some(String::from( |
输出:
1 | unwrap_or_else() moves the Option's value, and the default expression is lazily evaluated |
map()
通过一个函数f(T)->U
把本Option<T>
转化成Option<U>
(**而不是U
**);若本Option
为None
,则返回None
而不panic;
1 | let o: Option<String> = Some(String::from("map() moves the Option's value")); |
输出:
1 | map() moves the Option's value |
map_or()
通过一个函数f(T)->U
把本Option<T>
转化成U
(而不是Option<U>
**);若本Option
为None
,则返回default
。注意:default
会被eagerly evaluated**,也就是说,无论是本Option
是Some
还是None
,default
都先被求值。下面的map_or_else
与之相反。
1 | fn get_usize() -> usize { |
输出:
1 | get_usize() is called |
map_or_else()
通过一个函数f(T)->U
把本Option<T>
转化成U
(而不是Option<U>
**);若本Option
为None
,则返回default
。注意:default
会被lazily evaluated**,也就是说,当且仅当本Option
是一个None
时default
才被求值。上面的map_or
与之相反。
1 | let o: Option<String> = Some(String::from( |
输出:
1 | map_or_else() moves the Option's value, and the default expression is lazily evaluated |
ok_or()
把本Option<T>
转化成Result<T, E>
:若为Some(v)
则结果为Ok(v)
;若为None
则结果为Err(err)
。注意:err
会被eagerly evaluated,也就是说,无论本Option
是Some
还是None
,err
都先被求值。下面的ok_or_else
与之相反。
1 | fn get_usize() -> usize { |
输出:
1 | get_usize() is called |
ok_or_else()
把本Option<T>
转化成Result<T, E>
:若为Some(v)
则结果为Ok(v)
;若为None
则结果为Err(err)
。注意:err
会被lazily evaluated,也就是说,当且仅当本Option
是一个None
时err
才被求值。上面的ok_or
与之相反。
1 | let o: Option<String> = Some(String::from("ok_or_else() moves the Option's value, and the error expression is lazily evaluated")); |
输出:
1 | Ok("ok_or_else() moves the Option\'s value, and the error expression is lazily evaluated") |
and()
若本Option
是Some
则返回参数给定的optb
;否则,本Option
为None
,返回None
。注意:optb
会被eagerly evaluated,也就是说,无论本Option
是Some
还是None
,optb
都先被求值。下面的and_then
与之相反。
可以理解成:*this && optb
,二者若有一个为None
则结果就是None
,且逻辑表达式求值时不短路,即无论*this
的结果是true
还是false
都要对optb
求值。
1 | fn get_option() -> Option<usize> { |
输出:
1 | get_option() is called |
and_then()
若本Option
是Some(v)
则返回参数给定的f(v)
;否则,本Option
为None
,返回None
。注意:f()
会被lazily evaluated,也就是说,当且仅当本Option
是一个Some
时f()
才被求值。上面的and
与之相反。
可以理解成:*this && f()
,二者若有一个为None
则结果就是None
,且逻辑表达式求值时会短路,即若*this
为false
,则不调用f()
,直接返回;
1 | { |
输出:
1 | Some(35) |
or()
若本Option
是Some
则返回本Option
;否则,返回参数给定的optb
。注意:optb
会被eagerly evaluated,也就是说,无论本Option
是Some
还是None
,optb
都先被求值。下面的or_else
与之相反。
可以理解成:*this || optb
,二者若有一个为Some
则结果就是Some
,且逻辑表达式求值时不短路,即无论*this
的结果是true
还是false
都要对optb
求值。
1 | fn get_str_option() -> Option<String> { |
输出:
1 | get_str_option() is called |
or_else()
若本Option
是Some
则返回本Option
;否则,返回参数给定的f()
。注意:f()
会被lazily evaluated,也就是说,当且仅当本Option
是一个None
时f()
才被求值。上面的or
与之相反。
可以理解成:*this || f()
,二者若有一个为Some
则结果就是Some
,且逻辑表达式求值时会短路,即若*this
为true
,则不调用f()
,直接返回;
1 | { |
输出:
1 | Some("or_else() moves the Option\'s value, and the expression is lazily evaluated") |
xor()
当且仅当本Option
和参数optb
二者之中有一个Some
,才返回这个Some
;否则返回None
。注意,optb
一定会被求值,因为只有求值才知道它是Some
还是None
。
可以理解成:*this ^ optb
。
1 | fn get_str_option() -> Option<String> { |
输出:
1 | get_str_option() is called |