2019-07-12
<=>メソッドのオーバーライドによる比較の実装
名著”[Effective Ruby](https://www.amazon.co.jp/Effective-Ruby-Peter-J-
Jones/dp/4798139823)“に「<=>
と Comparable モジュールで比較を実装しよう」と書いてあったので江戸時代の身分制度を実装してみた。
class Rank
include Comparable
attr_reader :name
NAMES = ['士', '農', '工', '商'].map(&:freeze).freeze
def initialize(name)
unless NAMES.include?(name)
raise(ArgumentError, "Argument must be any of #{NAMES}")
end
@name = name
end
def <=> (other)
NAMES.index(self.name) <=> NAMES.index(other.name)
end
end
['農', '工', '士', '商'].map{|s| Rank.new(s)}.sort.map{|rank| rank.name}
# => ["士", "農", "工", "商"]
Rank.new('農') < Rank.new('商') # => true
Rank.new('農') > Rank.new('商') # => false
Rank.new('士') == Rank.new('士') # => true
Rank.new('工').between?(Rank.new('士'), Rank.new('商')) # => true
おしまい。