QA@IT
«回答へ戻る

回答を投稿

ActiveSupport 3.2 での blank? の大まかな挙動は以下の通りです:

  • nil か false なら true を返す
  • empty? に反応するオブジェクト (Array や Hash) の場合、空なら true を返す
  • 文字列の場合、長さが 0 または空白文字 (全角空白を含む) のみなら true を返す
  • それ以外の場合 false を返す

(参考: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/blank.rb)

というわけで、「なんとなく空っぽいもの」であれば blank? だけで判定できるようになっています。逆に、例えば nil と空の配列、空文字列と空白文字のみの文字列を区別したいような場面では使えません。

一点注意しないといけないのが nil? の扱いです。blank? はオブジェクトが nil ならば true を返しますが、nil? をオーバーライドして true を返すようにしているオブジェクトでは false を返します。

>> o = Object.new
=> #<Object:0x000000048f32a8>
>> def o.nil?
>> true
>> end
=> nil
>> o.blank?
=> false

普段こんなコードを書くことはないと思いますが、ライブラリ内で使われているような場合に知らないとハマってしまうので気を付けてください。

(思い出せる範囲では Mongoid の AssociationProxy がこんな実装になっていたと思います)

ActiveSupport 3.2 での ```blank?``` の大まかな挙動は以下の通りです:

* nil か false なら true を返す
* ```empty?``` に反応するオブジェクト (Array や Hash) の場合、空なら true を返す
* 文字列の場合、長さが 0 または空白文字 (全角空白を含む) のみなら true を返す
* それ以外の場合 false を返す

(参考: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/blank.rb)

というわけで、「なんとなく空っぽいもの」であれば ```blank?``` だけで判定できるようになっています。逆に、例えば nil と空の配列、空文字列と空白文字のみの文字列を区別したいような場面では使えません。

一点注意しないといけないのが ```nil?``` の扱いです。```blank?``` はオブジェクトが nil ならば true を返しますが、```nil?``` をオーバーライドして true を返すようにしているオブジェクトでは false を返します。

``` ruby
>> o = Object.new
=> #<Object:0x000000048f32a8>
>> def o.nil?
>> true
>> end
=> nil
>> o.blank?
=> false
```

普段こんなコードを書くことはないと思いますが、ライブラリ内で使われているような場合に知らないとハマってしまうので気を付けてください。

(思い出せる範囲では Mongoid の AssociationProxy がこんな実装になっていたと思います)