6

この記事では、ruby 1.9でprocを呼び出す4つの方法について説明し、===はそのうちの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、#]
4

4 に答える 4

5

===JavaScriptとは異なり、Rubyでは平等ではないことに注意してください。特に大文字小文字の表現に使用されます:

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
于 2012-03-12T21:14:39.867 に答える
4

これはドキュメントが言わなければならないことです:

これは、procオブジェクトがwhencaseステートメントの句のターゲットになることを可能にするためです。

これは、おそらく考案された例です。

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ようにするためのツールと考えてください。何かが偶数のセットに属しているかどうかを判断できるオブジェクトを定義しました。

于 2012-03-12T21:10:47.173 に答える
2

この機能は、比較時に何かを計算する必要がある場合の構築に役立ちます。

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
于 2012-03-12T21:17:02.880 に答える
0

===の通常の意味(2つのオブジェクトが同じオブジェクトであるかどうかを尋ねる)と何らかの関係がありますか?

===実際、これはRubyでよくある誤解です。これは実際には厳密にObject#object_id比較するためのものではありません(ただし、これは多くの一般的な呼び出しでの動作です)。Rubyでは、===ケースの包含です。

===fromの説明は次のObjectとおりです。「CaseEquality-クラスObjectの場合、実質的に#==を呼び出すのと同じですが、通常、caseステートメントで意味のあるセマンティクスを提供するために子孫によってオーバーライドされます。」

悲しいことに、それは3つで構成さ=れていますが、平等とはリモートでさえ関係がありません:-D

于 2012-03-13T04:25:51.710 に答える