1. ホーム
  2. ruby

[解決済み] Rubyの"==="演算子は何をするのですか?重複] [重複

2022-08-15 02:32:41

質問

重複の可能性があります。

=== Rubyにおける==と==の比較

最近何度か使われているのを見たのですが、何をするものなのかがわかりません。どなたか、どのように機能するか説明していただけませんか?

どのように解決するのですか?

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

なお、この演算子を検索する場合、通常は 三重等号演算子 または 三項演算子 または 格等号演算子 . 私はこれらの名前が本当に嫌いです。なぜなら、この演算子は等式とは全く関係がないからです。

特に、等式は対称であることが期待されます:もし ab であるならば b と同じであることが望ましい。 a . また、等号は他動的であることが期待されます。 a == bb == c であれば a == c . 実際に を保証することはできません。 を保証する方法はありませんが、少なくともこの性質を維持するように努力すべきです (例えば、Ruby のような単一ディスパッチ言語では coerce プロトコルに従うなど)。

しかし === には、対称性も推移性も期待できません。実際、非常に意図的に ではなく 対称的ではありません。ですから、私はこの製品を というような と呼ぶのは好きではありません。それが私が思う理由でもあります 何か別の呼び名にすべきだったと ~~~ などと呼ぶべきだったと思う理由でもあります。