<=>演算子
3 <=> 5
基本的な比較演算子。ほかの比較演算子はこの演算子を元に Comparable モジュールで定義されています。左が大きければ 1, 等しければ0, 右が大きければ -1 を返すように作ることが期待されています。
irb(main):001> 2 <=> 1
=> 1
irb(main):002> 2 <=> 2
=> 0
irb(main):003> 1 <=>2
=> -1
irb(main):004> 2 <=> "abc"
=> nil
irb(main):005> 'xyz' <=> 'abc'
=> 1
irb(main):006> 'abc' <=> 'abc'
=> 0
irb(main):007> 'abc' <=> 'xyz'
=> -1
irb(main):008> 'abc' <=> '123'
=> 1
irb(main):009> 'abc' <=> 123
=> nil
irb(main):010> 2 >1
=> true
irb(main):011> 2 <= 1
=> false
irb(main):012> 2 === 1
=> false
irb(main):013> 'abc' > "xyz"
=> false
irb(main):014> 'abc' <= 'xyz'
=> true
irb(main):015> 'abc' == 'xyz'
<=>も定義してsortする
比較演算を許すクラスのための Mix-in です。このモジュールをインクルードするクラスは、基本的な比較演算子である <=> 演算子を定義している必要があります。
irb(main):017* class Tempo
irb(main):018* include Comparable
irb(main):019*
irb(main):020* attr_reader :bpm
irb(main):021*
irb(main):022* def initialize(bpm)
irb(main):023* @bpm = bpm
irb(main):024* end
irb(main):025*
irb(main):026* def <=>(other)
irb(main):027* if other.is_a?(Tempo)
irb(main):028* bpm <=> other.bpm
irb(main):029* else
irb(main):030* nil
irb(main):031* end
irb(main):032* end
irb(main):033*
irb(main):034* def inspect
irb(main):035* "#{bpm}bpm"
irb(main):036* end
irb(main):037> end
=> :inspect
irb(main):038> t_120 = Tempo.new(120)
=> 120bpm
irb(main):039> t_120 = Tempo.new(180)
=> 180bpm
irb(main):040> t_180 = Tempo.new(180)
=> 180bpm
irb(main):041> t_120 = Tempo.new(120)
=> 120bpm
irb(main):042> t_120 > t_180
=> false
irb(main):043> t_120 <= t_180
=> true
irb(main):044> t_120 == t_180
=> false
<=>演算子とsort
配列の内容をソートします。要素同士の比較は <=> 演算子を使って行います。sort はソートされた配列を生成して返します。
irb(main):045> tempos = [Tempo.new(180), Tempo.new(60), Tempo.new(120)]
=> [180bpm, 60bpm, 120bpm]
irb(main):046> tempos.sort
=> [60bpm, 120bpm, 180bpm]
感想
あるモジュールをincludeするには特定のメソッドを作っておかなければならない。