2009-04-20 1 views
3

私はeqlを知っていますか?代わりに、==オブジェクトがキー*と一致するかどうかを確認するためにハッシュによって使用される、とあなたは==演算子をサポートする場合 Rubyが==とeqlを持っている理由はありますか? ? (to_aとto_aryと同様)

def ==(rb) 

を行うが、ハッシュは使用しないことを正当な理由がなければなりませんさ。何故ですか?あなたは==とeqlの定義をいつ作成しますか? ではなく、と同等です(たとえば、一方は他方のエイリアスです)。

同様に、なぜto_aに加えてto_aryが必要ですか?

この質問は、answerにお返事してくれました。another questionです。

*もちろん、ハッシュもeqlを前提としていますか? == trueは、ハッシュコードが等しいことを意味します。

また、等しくオーバーライドするのは基本的に大変な考えですか? ?

+0

可能な重複[等しい、eql ?, ===、==?]の違いは何ですか?(http://stackoverflow.com/questions/7156955/whats-the-difference-between-equal-eql - および) – jtbandes

答えて

9

私はルビーのこの特定の選択の理由を知らないが、私は、平等は難しい概念であることを指摘したい。

例えば同じオブジェクトへの2つの参照の違いを見分けることができて非常に便利です当量、EQL、等しい、equalp、そしてそのことについて=

、2つの異なるオブジェクトを持っているCommon Lispのは、同じ値を持つが同じ型であるが、型が異なる2つのオブジェクトなどがあります。

私は(私はルビーを使用していない)、それを正しくリコール、ルビーズ述語はこれらの例3を実装している場合

==は値

EQLの平等のですか?値と型の等価です

と等しいですか? trueの場合にのみ、同じオブジェクト

+0

私はあなたが実際にこの答えについて考えていることを伝えることができます。これまでに投稿されたものの中で、これは最も直接的に、なぜ私が探していたものなのかという質問に答えています。他の人たちは、「違いは何ですか?私はまた、これが一般的な言語設計の質問であることを指摘するのが好きです。確かに、それは平等になると目を満たす以上のものがあります! – allyourcode

13

== 2つの値が等しいかどうかを確認しますが、eql?それらが同じ型であるかどうかをチェックします。

irb(main):001:0> someint = 17 
=> 17 
irb(main):002:0> someint == 17 
=> true 
irb(main):003:0> someint.eql? 17 
=> true 
irb(main):004:0> someint.eql? 17.0 
=> false 
irb(main):005:0> someint == 17.0 
=> true 
irb(main):006:0> 

上記のように、eql?両方の値が同じタイプであるかどうかをテストします。 someintが浮動小数点値ではなかったため、これはfalseと等しい17.0と比較した場合です。

0

のはハッシュクラス(なしto_a)にはto_ary方法がないと思われますが、Arrayクラスのため、to_aとto_aryは異なる動作を持っている:

to_a:

自己を返します。 Arrayのサブクラスで呼び出された場合、受信者をArrayオブジェクトに変換します。

to_ary:

自己を返し

3

Thisはto_aとto_ary(及びto_sとto_str、及びto_i及びto_int)は厳密の異なるレベルを持っていることを言及しています。例えば、

17.to_s 

は理にかなって、

17.to_str 

はしていません。

+0

リンクありがとうございます。それは私がまだ確信していないが、推論のいくつかを説明している。 また、私はあなたが「Ruby_に合っている」ことを意味すると思います。私にとっては、17.to_sは動作しますが、17.to_strは動作しないことはほとんどありません。 – allyourcode

+1

to_s/to_a/to_f/to_iはすべて明示的な変換です。 to_str/to_ary/to_intはすべて暗黙的な変換です。たとえば、私が書いたURIライブラリがあります。私のURIクラスはto_strを実装しています。なぜなら、String型のURIをパラメータとするメソッドがあると、パラメータとして渡す前にURIオブジェクトをStringに明示的に変換する必要がないからです。 to_strメソッドでこれを行うことができます。 –

0

以上の回答はeql?ですが、ここにはto_ato_aryのものがあります。 Rubyのダックタイピングスキームでは、オブジェクトを2つの方法、つまり緩やかにしっかりと変換することができます。緩やかな変換は次のようになります。 Can fooは、自体を配列(to_a)と表します。これは、to_ato_sto_iなどの1文字のものです。したがって、Stringはそれ自身を配列として表すことができるので、to_aを実装します。企業の変換には何か非常に異なるものがあります。fooは文字列(to_ary)です。これはfooのクラスが文字列ではなく、fooと文字列がであるかどうかを交換可能であることに注意してください。 - 文字列が期待される場所であれば、fooを論理的に使用できます。私のRubyブックの例はローマ数字クラスです。ローマ数字では正の整数を使うことができるので、ローマ数字ではto_intを実装できます。 のクラスは互換性がありますリレーションシップは企業変換を実装する必要がありますが、ルーズはほぼすべてのクラスを対象としています。通訳者が誤って誤って解釈してしまうと、C++のreinterpet_cast<>に匹敵するバグに終わるでしょう。良くない。

関連する問題