if/unless と論理演算子チートシート

2023/09/07に公開

まとめ

if a && b if a || b unless a && b unless a || b
[true, true] 成立 成立(短絡) 不成立 不成立(短絡)
[true, false] 不成立 成立(短絡) 成立 不成立(短絡)
[false, true] 不成立(短絡) 成立 成立(短絡) 不成立
[false, false] 不成立(短絡) 不成立 成立(短絡) 成立
  • 「成立」のとき if/unless のブロックに入る

動機と考察

  • unless a || b としたとき、片方 false だったら成立(ブロックに入る)のかがぱっと見でわからず混乱したので、この際全パターン見ようと思った
  • if/unless 式の演算結果が truefalse かをみているだけ
  • 短絡評価されるかどうかは boolean と論理演算子(&&, ||)の関係だけで決まる

動作確認したコード

def side_effect(b)
    p "#{b}_side_effect"
    b
end

dat = [[true, true],[true, false],[false, true],[false, false],]

for d in dat do
    p d
    if side_effect(d[0]) && side_effect(d[1])
        p "if and"
    end
    p "-"
    if side_effect(d[0]) || side_effect(d[1])
        p "if or"
    end
    p "-"
    unless side_effect(d[0]) && side_effect(d[1])
        p "unless and"
    end
    p "-"
    unless side_effect(d[0]) || side_effect(d[1])
        p "unless or"
    end
end
GitHubで編集を提案

Discussion