はじめに
Rubyのnilガードについて調べてみたので、
備忘録的に残しておこうと思います。
間違いなどありましたらご指摘いただけると幸いです。。
概要
そもそもnilガードとは何かというと、
名前の通りnilが入らないようにするものです。
具体的には下記のような挙動になります。
pry(main)> a = nil
=> nil
pry(main)> a ||= "OK"
=> "OK"
pry(main)> b = 1
=> 1
pry(main)> b ||= "OK"
=> 1
左辺がnilの場合は値が代入され、既に値が入っている場合は
値の代入は行われません。
試してみる
ここで、ふと思いました。
nil以外にも値が代入されることはあるのだろうか。。
ということで早速試してみました。
pry(main)> a = ""
=> ""
pry(main)> a ||= "OK"
=> ""
pry(main)> b = 0
=> 0
pry(main)> b ||= "OK"
=> 0
pry(main)> c = []
=> []
pry(main)> c ||= "OK"
=> []
pry(main)> d = {}
=> {}
pry(main)> d ||= "OK"
=> {}
pry(main)> e = false
=> false
pry(main)> e ||= "OK"
=> "OK"
ふむふむ。
どうやらnil以外にfalseだった場合も値の代入が行われているようです。
これらを踏まえ、「条件式においてfalseになる場合のみ値の代入が行われる」という仮説を立てました。
Rubyではnilとfalse以外は全てtrueとみなされます。
値がtrueかfalseなのかを知りたい場合は、否定演算子「!」を確認したい値の前に2つ付ければ確認することができます。
実際に先ほど実行した値を確認してみましょう。
pry(main)> !!""
=> true
pry(main)> !!0
=> true
pry(main)> !![]
=> true
pry(main)> !!{}
=> true
pry(main)> !!false
=> false
pry(main)> !!nil
=> false
仮説通り、nilガードで値が代入されなかったものはすべてtrueになってますね。
結論
nilガードを使用すると、左辺がfalseになる場合のみ値の代入が行われ、
左辺がtrueになる場合は値の代入が行われない。