読者です 読者をやめる 読者になる 読者になる

まっしろけっけ

めもてきなやーつ

初心者は役立つかもしれない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
一部の出力は見やすいように加工してますよ