1
0

More than 1 year has passed since last update.

【Rails】present?を少し理解してみる(クイズあり)

Last updated at Posted at 2022-07-24

僕は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してね

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0