В операндах Rust Логическое ИЛИ (||
) должно быть bool
. Поэтому невозможно использовать его с Option
или любым другим типом.
Но, пожалуйста, смотрите метод or
из документации из Option
.
Возвращает параметр, если он содержит значение, в противном случае возвращает optb.
Ваша проблема может быть решена следующим образом:
let a = Some(3);
let b = None;
let result = a.or(b); // result: Some(3)
Если вы хотите получить результат как bool
, вы можете использовать is_some
или is_none
let result = a.or(b).is_some(); // true
let result = None.or(None).is_some(); // false
OR_ELSE
Аргументы переданы или с нетерпением оценены; если вы передаете результат вызова функции, рекомендуется использовать or_else, который лениво вычисляется.
Вы также можете использовать or_else
в такой ситуации:
let a = Some(3);
let result = a.or(produce_option());
Как видно из кода, является ли a
Some
или None
produce_option
, это может быть неэффективно в некоторых (или во многих) случаях.
let result = a.or_else(produce_option);
Здесь produce_option
будет вызываться только тогда, когда a
равно None
AND
Для Логическое И (&&
) вы можете использовать and
метод из Option
.
let a = None;
let b = Some(4);
let result = a.and(b); // result: None
Для ленивых вычислений вы можете использовать AND_THEN как OR_ELSE
.
UNWRAP_OR
unwrap_or
или unwrap_or_else
также можно использовать, если вы хотите взять значение внутри параметров при сравнении. Но это зависит от случая, я пишу это в качестве примера:
let a = None;
let b = None;
let x:i32 = a.unwrap_or(b.unwrap_or_default()); //Since `i32`'s default value is 0 `x` will be equal to 0
let a = None;
let b = Some(3);
let x:i32 = a.unwrap_or_else(||b.unwrap_or_default()); // `x` will be eqaul to 3
//using `unwrap_or_else` might be a better idea, because of the lazy evaluation.
Примечание: Этот ответ сфокусирован на Option
, но все они применимы для Result
объекты с одинаковым типом ошибки .