初心者は役立つかもしれないRuby(Rails)のmethod名に「?」がつくmethodのまとめ
まとめようと思った経緯
題名の通りRuby(Rails)にはmethod名に「?」がつくmethodが多く存在します。
「空文字の場合はtrue/falseどっち返すんだっけ?」ってなってconsole等で確認することが良くあるので、
(自分が)よく使うものを一覧でまとめておいてみる
環境とか
今回の検証環境は下記
下記のversionにしたのは最新使ってみたかったという理由のみ!
$ ruby -v ruby 2.2.0preview2 $ rails -v Rails 4.2.0.rc3
各methodで調べるデータは下記
- nil
- true
- false
- 文字(空文字と空文字以外)
- 数値(0と1)
- 配列(空配列と空配列以外)
- Hash(空Hashと空Hash以外)
実行するコードは下記
nil?の部分を各methodに変更していく
params = [nil, true, false, "", "hoge", 0, 1, [], [1], {}, {key: 1}] params.each do |param| begin result = param.nil? rescue => e result = e.message ensure puts "#{param}.nil? => #{result}" end end
Ruby編
nil?
nilかどうかを調べるnil?
当たり前かもしれませんがnil以外はfalse
nil.nil? => true true.nil? => false false.nil? => false "".nil? => false "hoge".nil? => false 0.nil? => false 1.nil? => false [].nil? => false [1].nil? => false {}.nil? => false {key: 1}.nil? => false
empty?
空かどうか調べるempty?
空文字、空配列、空hashのみtrueでした。
いくつかのclassでは定義されていないのでundefined methodの例外が発生しました。
nil.empty? => undefined method `empty?' for nil:NilClass true.empty? => undefined method `empty?' for true:TrueClass false.empty? => undefined method `empty?' for false:FalseClass "".empty? => true "hoge".empty? => false 0.empty? => undefined method `empty?' for 0:Fixnum 1.empty? => undefined method `empty?' for 1:Fixnum [].empty? => true [1].empty? => false {}.empty? => true {key: 1}.empty? => false
zero?
zeroかどうかを調べるzero?
Numeric classを継承しているclassにのみ定義されているようです。
最近使っただけでよくはつかわない
nil.zero? => undefined method `zero?' for nil:NilClass true.zero? => undefined method `zero?' for true:TrueClass false.zero? => undefined method `zero?' for false:FalseClass "".zero? => undefined method `zero?' for "":String "hoge".zero? => undefined method `zero?' for "hoge":String 0.zero? => true 1.zero? => false [].zero? => undefined method `zero?' for []:Array [1].zero? => undefined method `zero?' for [1]:Array {}.zero? => undefined method `zero?' for {}:Hash {key: 1}.zero? => undefined method `zero?' for {key: 1}:Hash
nonzero?
zeroじゃないかどうかを調べるnonzero?
zero? methodと同じでNumeric classを継承しているclassにのみ定義されているようです。
?付きmethodですが0の場合はnilを返し0じゃない場合はselfを返します。
最近使っただけでよくはつかわない
nil.nonzero? => undefined method `nonzero?' for nil:NilClass true.nonzero? => undefined method `nonzero?' for true:TrueClass false.nonzero? => undefined method `nonzero?' for false:FalseClass "".nonzero? => undefined method `nonzero?' for "":String "hoge".nonzero? => undefined method `nonzero?' for "hoge":String 0.nonzero? => nil 1.nonzero? => 1 [].nonzero? => undefined method `nonzero?' for []:Array [1].nonzero? => undefined method `nonzero?' for [1]:Array {}.nonzero? => undefined method `nonzero?' for {}:Hash {key: 1}.nonzero? => undefined method `nonzero?' for {key: 1}:Hash
Rails編
blank?
nil? + empty? のようなmethod
更にfalseでもtrueを返します
nil.blank? => true true.blank? => false false.blank? => true "".blank? => true "hoge".blank? => false 0.blank? => false 1.blank? => false [].blank? => true [1].blank? => false {}.blank? => true {key: 1}.blank? => false
present?
!blank?もしくはblank?.!のようなmethod
if 変数.present?とunless 変数.blank?は同じ意味になります。
nil.present? => false true.present? => true false.present? => false "".present? => false "hoge".present? => true 0.present? => true 1.present? => true [].present? => false [1].present? => true {}.present? => false {key: 1}.present? => true
blank?, present?のおまけ
空文字の際にtrueを返すblank?ですが下記の文字列でもtrueを返します
params = [" ", " ", "\t", "\n", "\r", "\r\n", "\f", "\s"] " ".blank? => true " ".blank? => true "\t".blank? => true "\n".blank? => true "\r".blank? => true "\r\n".blank? => true "\f".blank? => true "\s".blank? => true
present?で同じ文字列を判定
" ".present? => false " ".present? => false "\t".present? => false "\n".present? => false "\r".present? => false "\r\n".present? => false "\f".present? => false "\s".present? => false
ちなみにempty?の全てfalseを返します
" ".empty? => false " ".empty? => false "\t".empty? => false "\n".empty? => false "\r".empty? => false "\r\n".empty? => false "\f".empty? => false "\s".empty? => false
blank?がこのような挙動になるのはこちらをご覧ください。
まとめ
下記のような結果になったよ。
nil? | empty? | zero? | nonzero? | blank? | present? | |
---|---|---|---|---|---|---|
nil | true | × | × | × | true | false |
true | false | × | × | × | false | true |
false | false | × | × | × | true | false |
空文字 | false | true | × | × | true | false |
文字列 | false | false | × | × | false | true |
0 | false | × | true | nil | false | true |
1 | false | × | false | self | false | true |
空配列 | false | true | × | × | true | false |
配列 | false | false | × | × | false | true |
空Hash | false | true | × | × | true | false |
Hash | false | false | × | × | false | true |
×はundefined method
一部の出力は見やすいように加工してますよ