スペースシップ演算子(宇宙船演算子、spaceship operator)はWikipediaにも載ってた。
Spaceship operator - Wikipedia, the free encyclopedia

比較演算を許すクラスのための Mix-in です。このモジュールをインクルードするクラスは、基本的な比較演算子である <=> 演算子を定義している必要があります。

self <=> other は

* self が other より大きいなら正の整数
* self と other が等しいなら 0
* self が other より小さいなら負の整数
* self と other が比較できない場合は nil

をそれぞれ返すことが期待されています。

他の比較演算子は、 <=> 演算子を利用して定義されます。

module Comparable

サンプルコード。


class Kazu
 
  include Comparable
 
  attr_reader :kazu
 
  def initialize(base_num)
    @kazu = base_num
  end
 
  def <<(num)
    @kazu += num
    # メソッドチェーンできるようにselfを返す
    return self
  end
 
  # スペースシップ演算子
  def <=>(other)
    #self が other より大きいなら正の整数
    #self と other が等しいなら 0
    #self が other より小さいなら負の整数
    #self と other が比較できない場合は nil
    return @kazu - other.kazu
  end
 
end
 
kazu1 = Kazu.new(0)
kazu1 << 1 << 2 << 3
 
kazu2 = Kazu.new(1)
kazu2 << 4 << 5 << 6
 
puts "kazu1 : #{kazu1.kazu}"
puts "kazu2 : #{kazu2.kazu}"
puts "kazu1 <  kazu2 : #{kazu1 <  kazu2}"
puts "kazu1 <= kazu2 : #{kazu1 <= kazu2}"
puts "kazu1 == kazu2 : #{kazu1 == kazu2}"
puts "kazu1 != kazu2 : #{kazu1 != kazu2}"
puts "kazu1 >= kazu2 : #{kazu1 >= kazu2}"
puts "kazu1 >  kazu2 : #{kazu1 >  kazu2}"
puts "kazu1.between?(Kazu.new(1), Kazu.new(10)) : #{kazu1.between?(Kazu.new(1), Kazu.new(10))}"
puts "kazu2.between?(Kazu.new(1), Kazu.new(10)) : #{kazu2.between?(Kazu.new(1), Kazu.new(10))}"

実行結果。


C:\>ruby r3.rb
kazu1 : 6
kazu2 : 16
kazu1 <  kazu2 : true
kazu1 <= kazu2 : true
kazu1 == kazu2 : false
kazu1 != kazu2 : true
kazu1 >= kazu2 : false
kazu1 >  kazu2 : false
kazu1.between?(Kazu.new(1), Kazu.new(10)) : true
kazu2.between?(Kazu.new(1), Kazu.new(10)) : false

ちなみに、環境。


C:\>uname -mrsv
WindowsNT 1 5 x86
 
C:\>ruby -v
ruby 1.9.2p136 (2010-12-25) [i386-mingw32]

tags: ruby

Posted by NI-Lab. (@nilab)