-2

次のテスト ケースをパスする方法がわかりません。ユニオン (|) と list.include?(source) 内でソースを使用します。

 class Source
  # mongoid object code...
  def hash
    url.hash
  end

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

  def eql?(other_source)
    url = self.url and other_source and url == other_source.url
  end
end

テストケース:

  ext1 = Source.new
  ext2 = Source.new(url: "test")

  (ext2.== ext1).should               == false # false
  (ext1.== ext2).should               == false # is returning nil instead of false

最後のケースで nil ではなく false を返すようにしたいのですが、これを実現する方法がわかりません。

4

4 に答える 4

1

これの一般的なパターンは、式を「ダブルバン」することです。

!!(url = self.url && other_source && url == other_source.url)

trueこれは、またはに任意の値を強制しますfalse

(また、Ruby スタイル ガイド&&では、 and||の代わりにandandを使用することを推奨していorます。

于 2013-06-03T02:47:17.543 に答える
1

私はあなたのコードを実行し、行を打つとき

  ext2 = Source.new(url: "test")

私は得ArgumentError: wrong number of arguments(1 for 0)たので、これが機能するかどうかはわかりませんが、おそらくあなたは

  def eql?(other_source)
    url == self.url and other_source and url == other_source.url
  end
于 2013-06-03T02:47:54.850 に答える
1

なぜ url 変数なのですか?

# if they need to be the same class to be equal
def eql(other_source)
  Source === other_source && other_source.url == self.url
end

# OR, if it just matters that it responds to url
def eql(other_source)
  other_source.respond_to?(:url) && other_source.url == self.url
end

の真実性をテストするだけでは、それが真実でother_sourceあり、まだurlプロパティがない場合、例外を防ぐことはできないことに注意してください。たとえば、あなたが言った場合、現在のソリューションは例外を発生させます。ext1 == true

これは、あなたの例でext1は、最初eqlテストしているのはself.url. これは、あなたの望むことですか?それが基準である場合、少なくとも 2 つの情報源がurl等しいと見なされませんか?

于 2013-06-03T03:01:12.450 に答える
0

コードの一部を貼り付け忘れたかどうかはわかりませんが、次のような意味だったと思います。

class Source
  attr_reader :url

  def initialize(params = {})
    @url = params[:url]
  end

  def hash
    @url.hash
  end

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

  def eql?(other_source)
    other_source && @url == other_source.url
  end
end

それはあなたの問題を解決し、他のいくつかを修正します:

  1. という名前のインスタンス変数urlとそのゲッターが必要です。
  2. initializeメソッドが必要です。

eql?other_source次に、そうでないことを確認してsnilを比較するだけです。url

ext2.== ext1 # => false
ext1.== ext2 # => false
于 2013-06-03T02:58:28.427 に答える