Rubyのempty, false, nilなど
empty, false, nilとrailsにはblankもあるらしいけど、これしっかり覚える。
nil? empty? blank? present? の使い分け
nil? すべてのオブジェクトに定義されている。nilのときのみtrueを返す。 empty? 文字列の長さが0のとき、または配列が空のときにTrueを返す。もちろん数値には定義されていない。 blank? railsの拡張。nil, "", ” ”, [], {} のいずれかでTrueを返す。 present?は、!blank?と同じ意味
結果
・0 false nilは別物 ・nil?は、nilのときtrue。 (未定義の変数に使うとエラーになる。存在する配列の中の、存在しない要素だとエラーにならず、trueを返す) ・empty?は、文字列、配列に使えて、空文字列か配列が空のときtrue ・blank?は、nil, false, 空文字列, スペースだけの文字列, 配列が空のときtrue (未定義の変数に使うとエラーになる。存在する配列の中の、存在しない要素だとエラーにならず、trueを返す) ・present?は、!blank? PHPよりわかり易いと思った。 ・変数が定義済みかを確認するには、defined?を使える。
irbでやってみる。
a = 1a.nil?falsea.empty?ERRORa.blank?ERRORa.present?ERROR
b = ''b.nil?falseb.empty?trueb.blank?ERRORb.present?ERROR
c = falsec.nil?falsec.empty?ERROR
d = 0d.nil?falsed.empty?ERROR
z.nil?ERROR定義してない変数にnil使ってもエラー。falseでも0でも定義さえしてたら、nilじゃない。
c == 0falsefalseは0でもnilでもない。
f = []f.length0f.empty?truef.nil?falseemptyは文字列、配列に使える。数値には使えない。
rails consoleでやってみる。
$ rails ca = 1a.empty?ERRORa.blank?falsea.present?true
b = 0b.empty?ERRORb.blank?falseb.present?true
c = ''c.empty?truec.blank?truec.present?false
d = falsed.empty?ERRORd.blank?trued.present?falsefalseの場合もblank?はtrueを返す。
e = {}e.empty?truee.blank?truee.present?false
f(未定義)ERRORf.empty?ERRORf.blank?ERRORf.present?ERRORあら未定義だとblankもpresentもエラーになる。 railsのコントローラ上で試してみてもエラーになった。 定義済みじゃないとエラーになるのか。色々PHPと違う。
a = falselogger.debug 'a is blank' if a.blank?# logger.debug a if b.blank?c = {'a': 12, 'b':13}logger.debug 'c[:a] is present' if c[:a].present?logger.debug 'c[:c] is blank' if c[:c].blank?d = ' 'e = ' 'logger.debug 'd is blank' if d.blank?logger.debug 'e is blank' if e.blank?logger.debug 'c[:c] is nil' if c[:c].nil?上記をコントローラでやると、development.logに下記が表示される。
a is blankc[:a] is presentc[:c] is blankd is blanke is blankc[:c] is nil配列の要素に対しては、blankを使ってもエラーにならないらしい。
また、rails consoleでやってみる。
c = {}c['a'].blank?truec['a'].empty?ERRORc[:a].nil?trueあとは一応クラスつくって試してみる。
class Hoge attr_accessor :nameenda = Hoge.newa.namenila.name.nil?truea.name.empty?ERRORHoge.nil?falseHoge.blank?falseHoge.present?truea.nil?falsea.blank?falsea.present?true変数が存在するか確認するには、definedが使えるらしい。
rails consoleで試してみる
a = falseb = ''c = []d = new Hoge
defined? a=> "local-variable"defined? b=> "local-variable"defined? c=> "local-variable"defined? d=> "local-variable"defined? c[:a]=> "method"defined? d.name=> "method"defined? d.hoge=> nildefined? z=> nil未定義の変数に使ったらnilが返ってくる。存在する配列の存在しない要素に使うと、methodって返ってくる。存在するオブジェクトの値がnilのメンバ変数に使うと、methodって返ってくる。