6

eql?私はルビーとルビーの違いについて読んでいますが、値とタイプを比較しながら値を比較==することを理解しています==eql?

ルビーのドキュメントによると:

クラスObjectのオブジェクトの場合、eql?==と同義です。サブクラスは通常この伝統を引き継いでいますが、例外があります。

ドキュメントで指定されている動作が自動的に継承されるようには見えませんが、これはこれらのメソッドを実装する方法の提案にすぎません。==これは、どちらかをオーバーライドする場合、または両方をオーバーライドする必要があることも意味しますかeql?

以下のクラスPersonでは、これはオーバーライドの典型的な方法でeql?あり==、制限の少ないもの==がより制限のあるものに委任するだけです(タイプではなく値を比較するためだけに実装された場合、委任するのeql?は逆に思えます)。eql?====

class Person

  def initialize(name) 
    @name = name
  end

  def eql?(other)
    other.instance_of?(self.class) && @name == other.name
  end

  def ==(other)
    self.eql?(other)
  end

protected
    attr_reader :name

end
4

1 に答える 1

4

私は今混乱します、eqlをエイリアシングすることによってドキュメントが何を意味しましたか?および==メソッドは次のように実装されます。

class Test
  def foo
    "foo"
  end
  alias_method :bar, :foo
end

baz = Test.new
baz.foo #=> foo
baz.bar #=> foo

#override method bar
class Test
  def bar
    "bbq!"
  end
end

baz = Test.new
baz.foo #=> foo
baz.bar #=> bbq!

そのため、==をオーバーライドしても、eqlには影響しません。それらは「同義」ですが。したがって、あなたの場合、次のようになります。

class Person
  #...
  def ==(other)
    other.instance_of?(self.class) && @name == other.name
  end
  alias_method :eql?, :==
  #...
end
于 2012-06-28T05:32:43.930 に答える