Я знаю, что можно выразить логику AND между оператором if let и таким условием
if let (Some(a), true) = (b, c == d) {
// do something
}
Но что, если мне нужна логика ИЛИ?
if let (Some(a)) = b /* || c == d */ {
// do something
} else {
// do something else
}
Единственный способ, которым я это понимаю, заключается в следующем, но я думаю, что это немного уродливо, так как мне приходится дважды писать код
if let (Some(a)) = b {
// do something
} else if c == d {
// do something
} else {
// do something else
}
У вас действительно один и тот же код «сделать что-нибудь» в обоих случаях? Значит, этот код не использует a
?
Если a
не используется в организме, вы можете просто использовать if b.is_some() || c == d { ... }
. Если в теле используется a
является, то каким должно быть a
, когда b
есть None
, но c == d
?
Если у вас один и тот же код «сделать что-нибудь» в обоих случаях, он не должен использовать a
. В этом случае вы можете использовать is_some
:
if b.is_some() || c == d {
// do something
} else {
// do something else
}
В более общем случае вы можете использовать matches!
, чтобы проверить, соответствует ли b
шаблону, не создавая никаких привязок:
if matches!(b, Some(_)) || c == d {
// do something
} else {
// do something else
}
Связано: Поддерживает ли Rust 2018 цепочку «если позволите»?