1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
//! impl bool {}
impl bool {
/// 如果 `bool` 是 [`true`](../std/keyword.true.html),则返回 `Some(t)`,否则返回 `None`。
///
/// 传递给 `then_some` 的参数被热切地评估; 如果要传递函数调用的结果,建议使用 [`then`],它是惰性求值的。
///
///
/// [`then`]: bool::then
///
/// # Examples
///
/// ```
/// assert_eq!(false.then_some(0), None);
/// assert_eq!(true.then_some(0), Some(0));
/// ```
///
/// ```
/// let mut a = 0;
/// let mut function_with_side_effects = || { a += 1; };
///
/// true.then_some(function_with_side_effects());
/// false.then_some(function_with_side_effects());
///
/// // `a` 增加了两次,因为传递给 `then_some` 的值被急切地评估。
/////
/// assert_eq!(a, 2);
/// ```
///
///
#[stable(feature = "bool_to_option", since = "1.62.0")]
#[inline]
pub fn then_some<T>(self, t: T) -> Option<T> {
if self { Some(t) } else { None }
}
/// 如果 `bool` 是 [`true`](../std/keyword.true.html),则返回 `Some(f())`,否则返回 `None`。
///
///
/// # Examples
///
/// ```
/// assert_eq!(false.then(|| 0), None);
/// assert_eq!(true.then(|| 0), Some(0));
/// ```
///
/// ```
/// let mut a = 0;
///
/// true.then(|| { a += 1; });
/// false.then(|| { a += 1; });
///
/// // `a` 增加一次,因为闭包被 `then` 懒惰地评估。
/////
/// assert_eq!(a, 1);
/// ```
#[stable(feature = "lazy_bool_to_option", since = "1.50.0")]
#[inline]
pub fn then<T, F: FnOnce() -> T>(self, f: F) -> Option<T> {
if self { Some(f()) } else { None }
}
}