Ржавчина ИЛИ между двумя вариантами - PullRequest
0 голосов
/ 20 февраля 2020

Я хочу знать, возможно ли выполнить операцию ИЛИ между двумя опциями. Что-то вроде:

let a = Some(3);
let b = None;
let result = a || b;

Здесь я хочу, чтобы переменная result имела либо значение a, если это Some, либо значение b.

I не нашел документации по этому вопросу на Inte rnet.

1 Ответ

7 голосов
/ 20 февраля 2020

В операндах 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 объекты с одинаковым типом ошибки .

...