Ruby の <=> 演算子(宇宙船演算子)が返す値を覚える方法をメモっとく。Comparable を実装するときに悩むよね。
メソッドとして考えてみる
<=> 演算子といってもメソッドなので左辺のオブジェクトがレシーバーになる。メソッドが実装されているレシーバー側を主体として考えるとわかりやすい。レシーバー側が大きければ正数、レシーバー側が小さければ負数である。レシーバー側と等しければ 0、レシーバー側と比較できなければ nil である。
10 <=> 20 # -1
20 <=> 10 # 1
20 <=> 20 # 0
20 <=> '20' # nil
<=> 演算子を実装するレシーバー側として、自分が大きかったらプラスを返して、自分が小さかったらマイナスを返すっていう感覚は覚えやすいんではないかと。
- 演算子として考えてみる
@takumiabe さんのコメントより。
変数 a と変数 b を数値と考えると a <=> b の計算結果の符号は a - b の計算結果の符号と一致する。なお、等しい場合はどちらも 0 になる。
10 <=> 20 # -1
10 - 20 # -10
20 <=> 10 # 1
20 - 10 # 10
20 <=> 20 # 0
20 - 20 # 0
20 <=> '20' # nil
20 - '20' # TypeError: String can't be coerced into Fixnum
数直線として考えてみる
@taram さんのコメントより。
<=> 演算子を構成する3文字 <、=、> を数直線に配置する。与えられた左辺と右辺について成立する <、=、> いずれかの演算子に対応する数値が <=> 演算子の結果になる。
-1 0 1
----|----|----|----
< = >
参考文献