スペースシップ演算子(宇宙船演算子、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)