Techioz Blog

Rubyのif(value)とif(value.present?)の違いは何ですか? (if ステートメントでの暗黙的な変換)

概要

入力を使用してコードを実行した後: array = [nil, false, [], {}, {a: 1}, ““, [0], [nil], NoMethodError]

def same_value?(value)
   a = false
   b = false

   if value
     a = true
   end

   if value.present?
     b = true
   end
   [value, a == b]
end
array.map { |v| v.same_value? }

応答を受け取ります => [[nil, true], [false, true], [[], false], [{}, false], [{:a=>1}, true], [““, false ]、[[0]、true]、[[nil]、true]、[NoMethodError、true]]。

それで、どうやら if value と if value.present? ““、{}、および [] は、存在するものの空のコンテナであるため、別の方法で扱います。私の質問は、違いはそれだけですか?ということです。 if 値の暗黙的な条件チェックを行うときに、Ruby が実際に内部で使用している演算子は何ですか?この暗黙的な変換と一般化されたケースに関する詳細情報を見つけるために検索できるドキュメントや用語はありますか?

解決策

プレゼントという方法はないのでしょうか? Ruby のコア ライブラリか標準ライブラリのどちらかにあるため、何が存在するのかを知ることは不可能です。そうです。そのメソッドが何を行うのかを判断するには、そのメソッドの出所に関するドキュメントを参照する必要があります。

メソッドの出所がわからない場合は、Object#method メソッドを介してメソッドへの参照を取得し、Method#owner や Method などの Method クラスのメソッドの一部を使用することで、Ruby に助けを求めることができます。 #ソースの場所:

present_method = value.method(:present?)

present_method.owner
present_method.source_location

名前に基づいて、それは何かの存在をチェックする述語 (通常、名前が ? で終わるメソッドは述語です) であると思われます。

たとえば、Object#present? のドキュメントは次のとおりです。アクティブサポートの RubyGem から:

あなたはこう尋ねています:

なし。暗黙的な変換や演算子はありません。

真実性のルールは非常にシンプルです。

これは、Ruby に関するほぼすべての入門コース、書籍、ビデオ、チュートリアルで取り上げられています。名前が多すぎます。

「公式」ソースを探している場合は、少し注意が必要です。

残念ながら、他の多くのプログラミング言語とは異なり、Ruby 言語仕様は 1 つの文書として 1 か所に存在しません。 Ruby には、特定の言語構造の意味を定義する単一の正式な仕様はありません。

いくつかのリソースがあり、その合計が Ruby プログラミング言語の仕様の一種と考えることができます。

これらのリソースの一部は次のとおりです。

ISO/IEC 30170:2012 情報技術 - プログラミング言語 - Ruby 仕様からの真実性の定義は次のとおりです。

ISO/IEC 30170:2012 情報技術 - プログラミング言語 - Ruby 仕様に基づく if 式の定義は次のとおりです。

そして、ここに language/if_spec.rb の Ruby/spec からの定義へのリンクがあります。