やろうとしたこと
- 条件分岐をさせるにあたって boolean で結果を取得したかった
- 「オブジェクトが nil なら false を返してほしい」という目的
-
nil?
は「nil なら true を返す」ので論理否定と組み合わせた
-
▲しかし、論理否定!
をとnil?
を組み合わせて使うと自分が想定している結果が返ってこない
以下にサンプルを示す
ソースコード
p ("aaa")
p !("aaa")
p (nil)
p !(nil)
p ("----------")
p ("aaa").nil? #【1】
p !("aaa").nil? #【2】
p !(("aaa").nil?) #【3】
p ("##########")
p (nil).nil? #【4】
p !(nil).nil? #【5】
p !((nil).nil?) #【6】
実行結果
"aaa"
false
"----------"
false #【1】
true #【2】
true #【3】
"##########"
true #【4】
false #【5】
false #【6】
何が想定外と感じたか
- 【5】【6】の処理結果は異なると思っていた
⇒【5】は false になると思っていた- 【5】について
「nil
という値がある」という状態なのだから「(nil)
はtrue」と思っていた
- 【5】について
*nil
は「false」であるという原理原則を理解していなかった
原理原則として以下が存在する
-
true
は「真」 -
false
とnil
以外はすべて「真」 -
false
とnil
は「偽」
他メモ
- 今回、自分は Rails で開発していたのだから他のメソッドに頼ればよかった
-
present?
を使えば論理否定を使わなくて済んだはず
そっちの方が直感的で分かりやすい
-