Comparableモジュールと<=>演算子

# <=>演算子
>3 <=> 5
基本的な比較演算子。ほかの比較演算子はこの演算子を元に Comparable モジュールで定義されています。左が大きければ 1, 等しければ0, 右が大きければ -1 を返すように作ることが期待されています。

https://docs.ruby-lang.org/ja/latest/doc/symref.html#:~:text=3%20%3C%3D%3E%205,%E6%9C%9F%E5%BE%85%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

```rb
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 です。このモジュールをインクルードするクラスは、基本的な比較演算子である <=> 演算子を定義している必要があります。

https://docs.ruby-lang.org/ja/latest/class/Comparable.html#:~:text=%E6%AF%94%E8%BC%83%E6%BC%94%E7%AE%97%E3%82%92%E8%A8%B1%E3%81%99%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%20Mix%2Din%20%E3%81%A7%E3%81%99%E3%80%82%E3%81%93%E3%81%AE%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AF%E3%80%81%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E6%AF%94%E8%BC%83%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%A7%E3%81%82%E3%82%8B%20%3C%3D%3E%20%E6%BC%94%E7%AE%97%E5%AD%90%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

```rb
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 はソートされた配列を生成して返します。

https://docs.ruby-lang.org/ja/latest/method/Array/i/sort.html#:~:text=%E9%85%8D%E5%88%97%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E3%82%BD%E3%83%BC%E3%83%88%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E8%A6%81%E7%B4%A0%E5%90%8C%E5%A3%AB%E3%81%AE%E6%AF%94%E8%BC%83%E3%81%AF%20%3C%3D%3E%20%E6%BC%94%E7%AE%97%E5%AD%90%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82sort%20%E3%81%AF%E3%82%BD%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%81%9F%E9%85%8D%E5%88%97%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%A6%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

```rb
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するには特定のメソッドを作っておかなければならない。