Ruby の "===" 演算子は何をしますか? [重複] 質問する

Ruby の

重複の可能性あり:
Ruby における === と ==

最近、何度か使用されているのを見ましたが、何をするのかわかりません。どのように動作するのか説明できる人はいますか?

ベストアンサー1

Ruby(あるいは実際はほぼすべてのオブジェクト指向言語)の他のメソッドと同様に、

a === b

は、クラスの作成者がa望む意味を持ちます。

しかし、同僚を混乱させたくないのであれば、慣例的===格包含演算子。基本的には、ブール演算子で「ラベルの付いた引き出しがある場合、その引き出しにa入れるのは理にかなっていますか?b

別の表現は「aセットを記述した場合、bそのセットのメンバーになりますか?

例えば:

 (1..5) === 3           # => true
 (1..5) === 6           # => false

Integer === 42          # => true
Integer === 'fourtytwo' # => false

  /ell/ === 'Hello'     # => true
  /ell/ === 'Foobar'    # => false

この演算子の主な用途は式===の中でである。case

case foo
when bar
  baz
when quux
  flurb
else
  blarf
end

(大まかに)次のように翻訳される。

_temp = foo

if bar === _temp
  baz
elsif quux === _temp
  flurb
else
  blarf
end

この演算子を検索する場合は、通常は三重等号演算子または3等号演算子またはケース等価演算子私はこれらの名前が本当に嫌いです。なぜなら、この演算子は等号とはまったく関係がないからです。

特に、等式は対称的であることが期待されます。つまり、 がaに等しい場合bbも に等しいことが望ましいですa。また、等式は推移的であることが期待されます。つまり、 かつ の場合a == bb == cですa == c。実際に等式を とする方法はありませんが、保証Ruby のようなシングルディスパッチ言語では、少なくともこのプロパティを保持するように努力する必要があります (たとえば、プロトコルに従うなどcoerce)。

しかし、===対称性や推移性は期待されていない。実際、それは設計によるものである。ない対称的だ。だから私は、それを遠隔的に平等に似ています。だから、他の何かに名前をつけるべきだったとも思います~~~

おすすめ記事