ProcがRuby 1.9で===で呼び出されるのはなぜですか?
-
12-12-2019 - |
質問
この記事 procを呼び出す4つの方法Ruby 1.9では、===のうちの1つです。私はなぜこれがまったくこのように行われるのか理解していません。それは===の通常の意味と関係がありますか(2つのオブジェクトが同じオブジェクトであるかどうかを尋ねる)?
irb(main):010:0> f =-> n {[:hello, n]} => # irb(main):011:0> f.call(:hello) => [:hello, :hello] irb(main):012:0> f === :hello => [:hello, :hello] irb(main):013:0> Object.new === Object.new => false irb(main):014:0> f === f => [:hello, #].
解決
Procオブジェクトを
when
句のターゲットにすることを許可することです。 ケースステートメント
これは、おそらく考案された、例:
even = proc { |x| x % 2 == 0 }
n = 3
case n
when even
puts "even!"
else
puts "odd!"
end
.
case/when
は基本的にこのように実行されているため動作します。
if even === n
puts "even!"
else
puts "odd!"
end
.
case/when
は、===
句にwhen
句を呼び出すことによって実行するブランチをチェックし、最初の値を最初に選択します。
等価演算子(==
)と類似しているにもかかわらず、それはより強いまたは弱い形ではありません。 「属する」オペレータとして===
演算子を考えようとしています。 Class
は、オブジェクトがクラス(つまりクラスのインスタンスまたはクラスのサブクラスのインスタンス)に属しているかどうかを確認できるように、Range
は、引数の場合はチェックするように定義します。 の範囲(範囲内に含まれている)などに属します。これは、Proc
ケースをもっと理にかなっていませんが、上記の例のように、あなた自身のが演算子に属するためのツールと考えています。 がに属しているかどうかを判断できるオブジェクトを定義しました。
他のヒント
Rubyの===
は、JavaScriptとは異なり、平等性についてではありません。これは特に使用されています case式:
case cats.length
when 42 # Uses 42 === cats.length
puts :uh
when /cool/i # Uses /cool/i === cats.length
puts :oh
when ->(n){ n.odd? || n/3==6 } # Passes cats.length to the proc
puts :my
end
. この機能は、比較で何かを計算する必要がある場合は、工事の場合に役立ちます。
is_odd =-> n { n%2 != 0 }
is_even =-> n { n%2 == 0 }
case 5
when is_even
puts "the number is even"
when is_odd
puts "the number is odd"
end
=> the number is odd
. ===の通常の意味と関係はありますか(2つのオブジェクトが同じオブジェクトであるかどうかを尋ねる)?
実際には、Rubyの===
に関する共通の誤解です。それは実際にはObject#object_id
比較のために厳密にはありません(それは多くの一般的な呼び出しでの動作です)。Rubyでは、===
はケース sumsumption
===
からのObject
の説明です。
#==を呼び出すように、通常は子孫によって上書きされます
症例文に意味のある意味論を提供するために。」
悲しいことに、それが3つの=
で構成されていても、平等との関係にもリモートでさえありません: - d