Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | Comparable

概要

Comparable

詳細

Comparableモジュールはオブジェクトの比較を許容するためのmixinです。
このモジュールは<=>メソッドに依存し、該当メソッド
レシーバーと比較オブジェクトの比較結果が下記の結果を返却するように実装します。

大小関係 結果
レシーバーが小さい -1
レシーバーと等しい 0
レシーバーが大きい 1

サンプル

仕様

成績を表すGradeクラスを作成。
成績は良い順にA,B,Cとする。

コード
# encoding: utf-8
require "pp"

class Grade
  include Comparable
  GRADES = [:C, :B, :A]
  attr_accessor :grade

  def initialize(grade)
    @grade = grade
  end

  def <=>(other)
    _grade = other.grade
    raise "invalid grade" unless GRADES.include? _grade
    GRADES.index(@grade) <=> GRADES.index(_grade)
  end
end

grade_a = Grade.new(:A)
grade_b = Grade.new(:B)
grade_c = Grade.new(:C)
grade_a2 = Grade.new(:A)

p grade_a == grade_b
p grade_a > grade_b
p grade_a > grade_a2
p grade_a >= grade_b
p grade_a >= grade_a2
p grade_a < grade_b
p grade_a <= grade_b
p grade_b.between? grade_c, grade_a
p grade_b.between? grade_b, grade_a
p grade_a.between? grade_c, grade_b
出力
false
true
false
true
true
false
false
true
true
false