LoginSignup
7
8

More than 3 years have passed since last update.

Rubyのnilガードについて調べてみた

Posted at

はじめに

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になる場合は値の代入が行われない。

7
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8