僕はpresent?について「完全に理解」していた
Railsにはpresent?という便利なメソッドがあり、使う機会も見る機会もなかなかに多いです。
present?はblankではないオブジェクトに対してtrueを返してくれて、だいたいの場合において直感通りの挙動を示します。(present? = !blank?
)
しかし先日少し直感とは反する挙動に遭遇し、せっかく検証したのでメモを残しておきます
blank?ってなんだっけ?
blank?メソッドの仕様はこちら
An object is blank if it’s false, empty, or a whitespace string. For example, false, ”, ‘ ’, nil, [], and {} are all blank.
falsyなオブジェクト or emptyなオブジェクト or 空白文字がblankなオブジェクトになります。
まあそうだよねーという感じでしょうか
empty?
がどんな判定か、空文字が何かを理解できていればblank?
あるいはpresent?
について「なにもわからない」状態になれるのではないでしょうか
※ 「なにもわからない」状態についてはこちら参照ください
https://togetter.com/li/1268851
ということでクイズ
ほとんど環境による差はないと思いますが、一応検証環境です。
- Ruby: v3.1.0
- Rails: v7.0.2.2
以下はどんな結果になるでしょう?
# Q1
:''.present?
# Q2
:' '.present?
# Q3 (全角スペース)
' '.present?
# Q4
"\n\r\s\t".present?
# Q5
{ nil => nil }.present?
# Q6
[nil].present?
# Q7 (NaN)
(0.0/0.0).present?
(blank?で問題出せよという声も聞こえてきそうですが、present?のほうが使う機会多いと思うのでこのような出題にしています。)
気になる解答
こちら
# Q1
:''.present?
#=> false
# Q2
:' '.present?
#=> true
# Q3 (全角スペース)
' '.present?
#=> false
# Q4
"\n\r\s\t".present?
#=> false
# Q5
{ nil => nil }.present?
#=> true
# Q6
[nil].present?
#=> true
# Q7
(0.0/0.0).present?
#=> true
全問正解できたでしょうか?
ちなみに僕は[nil].present?
は当然falseを返すだろうと思い込んでいました。(trueが返ってきたのでこの記事を書くことにしたという次第です。)
おまけ
ドキュメントには以下のように書かれており、最初blank?の中身は!address || address.empty?
かと誤読しておりました・・(⌒-⌒; )
This simplifies
!address || address.empty?
to
address.blank?
これは!address || address.empty?
=> address.blank?
のように簡略化できますよという意味で、両者は同義ではないです。
まとめ
覚える必要はないですが、たまに騙されるので注意
他にも面白い挙動のオブジェクトがあればコメントくださいませ^-^
全問正解できなかった人はLGTMしてね