6

2つの異なる属性に基づいてRubyで比較を定義する簡単な方法(つまり、宇宙船演算子を使用)はありますか? つまり、attr1 と attr2 の 2 つの属性を含むクラスがある場合、attr1 でこのクラスの 2 つのインスタンスを比較し、それらが等しい場合は attr2 でそれらを比較する Rubyesque の方法はありますか?

4

3 に答える 3

15

これは、(より多くの属性に) 簡単に拡張できる方法です。

def <=>(other)
  [self.attr1, self.attr2] <=> [other.attr1, other.attr2]
end
于 2013-01-15T20:26:48.220 に答える
7

比較可能な mixin の要点は、宇宙船 (比較) オペレーターの定義を提供することです。したがって、2 つの属性を比較したい場合は、それを実行してください。非常に冗長な例を次に示します。

def <=>(obj)
  comparison = self.attr1 <=> obj.attr1

  if comparison == 0
    return self.attr2 <=> obj.attr2
  else
    return comparison
  end
end

明らかに、上記は を想定してattr1おり、attr2両方とも宇宙船オペレーターの定義を持っています。同様に、2 つの属性にまたがって大なり小なりを構成するものを判断する必要があります。これはおそらく少し難しいことです。これは、シナリオに適したコードではない可能性があることを示唆しています。


これをより簡潔で慣用的な方法で書くと、次のようになります。

def <=>(obj)
  self.attr1 <=> obj.attr1 == 0 ? self.attr2 <=> obj.attr2 : self.attr1 <=> obj.attr1
end
于 2011-11-14T15:24:33.880 に答える