Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

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

"<=>"メソッドを定義し、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

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