// dictionary
論理演算子.
論理演算子は、論理値型の値を組み合わせて新しい論理値を作る演算子です。比較演算子(==や>=など)の結果を「かつ」「または」で組み合わせる条件式でよく使います。
| 演算子 | 意味 | 例 |
|---|---|---|
&& |
論理AND(かつ) | true && false → false |
|| |
論理OR(または) | true || false → true |
! |
論理NOT(否定) | !true → false |
fn main() {
let age = 20;
let has_ticket = true;
let can_enter = age >= 18 && has_ticket; // 18歳以上かつチケットあり
println!("入場{}", if can_enter { "できます" } else { "できません" });
}Playgroundで開く短絡評価
&&と||は短絡評価(short-circuit evaluation)を行います。左辺だけで結果が確定する場合、右辺は評価されません。
&&: 左辺がfalseなら右辺を評価せずfalseを返します||: 左辺がtrueなら右辺を評価せずtrueを返します
この性質を使うと「右辺を評価すると危険な式」を安全に書けます。
短絡評価の活用例(0除算の回避)
fn main() {
let total = 300;
let count = 0;
// countが0のとき右辺の除算は実行されないため、パニックしない
if count > 0 && total / count >= 100 {
println!("1個あたり100円以上です");
} else {
println!("計算できないか、100円未満です");
}
}Playgroundで開く補足
短絡評価しない論理演算子(& | ^)
boolには&(AND)・|(OR)・^(XOR)も適用でき、こちらは短絡評価せず両辺を必ず評価します1。副作用のある式を必ず実行したい場合や、排他的論理和が必要な場合に使います。なお、^に対応する短絡評価版はありません(XORは両辺の値が揃わないと結果が決まらないため)。
複合代入と対応するトレイト
& | ^には複合代入演算子(&= |= ^=)がありますが、短絡評価する&& ||には複合代入形(&&= ||=)は存在しません。
また、!はstd::ops::Not、&はBitAnd、|はBitOr、^はBitXorトレイトに対応しており、独自の型にも実装できます。一方、短絡評価する&&と||はトレイトに対応しておらず、bool型の値専用です(&boolのような参照はそのままでは使えず、*によるデリファレンスが必要です)。
他言語との違い(truthy/falsyはない)
JavaScriptなどの||は「左辺がfalsyなら右辺の値そのものを返す」ため、name || "ゲスト"のようなデフォルト値の指定に使えます。一方Rustの論理演算子はbool専用で結果も必ずboolのため、この書き方はできません。数値や文字列にtruthy/falsyの概念もなく、条件には明示的な比較式を書きます。
fn main() {
let count = 3;
if count || count > 10 { // エラー: E0308(boolではなく整数を渡している)
println!("在庫あり");
}
}Playgroundで開く「なければデフォルト値」はRustではOption型のunwrap系のメソッドで表現します(例: name.unwrap_or_else(|| "ゲスト".to_string()))。
Footnotes
この辞書が使われているページ
backlinks 4