読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

Comparbleモジュールを組み込んで比較メソッドを楽に定義する

ruby

"<=>"メソッドを定義し、Comparbleモジュールを読み込むと、
"<", "<=", ">", ">="といったメソッドを追加することができます。

実際のところ

前のコードを改造して、以下のようにします。

require 'pp'

class Rarity
  include(Comparable)
  attr_reader :rarity

  def initialize(rarity = :common)
    @rarity = rarity
  end

  def <=>(other)
    rarity_tbl = {damaged: 0, common: 1, uncommon: 2, rare: 3}
    rarity_tbl[rarity] <=> rarity_tbl[other.rarity]
  end
end

class Card
  attr_reader :rarity, :name

  def initialize(rarity = :common, name)
    @rarity = Rarity.new(rarity)
    @name   = name
  end
end

ary = [] 
ary << Card.new(:rare,     :firefox) 
ary << Card.new(:common,    :ie)
ary << Card.new(:rare,     :chrome)
ary << Card.new(:uncommon, :opera)
ary << Card.new(:damaged,  :unknown)

print ":damaged > :common should be ture =>  #{ary[4].rarity > ary[1].rarity}\n"

通常のシンボルの比較なら、

:damaged > :common
=> true

となります。
実際に上記を実行すると

:damaged > :common should be ture =>  false

と出て、ちゃんと<=>メソッドで定義してあげた順に優先付けされている事が確認できます。