15.Ruby|よく使う記号

Rubyのコードを読んでると『よく出てくるけど何だっけコレ?』となって、毎回のように調べている記号がある。
確認しやすいようにここにまとめておこうと思う。

||=

a ||= xxx

自己代入演算子。aが偽か未定義ならば、aにxxxを代入(aが正ならば、代入しない)。

<<

ary = [1]
ary << 2
p ary # [1,2]

# 下記のように連続して書くこともできる。
ary = [1]
ary << 2 << 3 << 4
p ary # => [1,2,3,4]

self << obj
指定されたobjを自身の末尾に破壊的に追加。

&.

10&.to_s # => "10"
nil&.to_s # => nil

レシーバーがnilの時、NoMethodErrorを投げずにnilを返す。
nilチェックの条件式を書かなくても、安全にメソッドを呼び出すことができる。

<=>

[1, 2, 3] <=> [1, 3, 2] # => -1 (2つ目の要素比較時、2<3なので)
[1, 2, 3] <=> [1, 2, 3] # => 0 (要素数・各値ともに等しいので)
[1, 2, 3] <=> [1, 2] # => 1 (2つ目の要素まで等しく、左辺のみ3つ目の要素があるので)
[1, 3] <=> [1, 2, 3] # => 1 (2つ目の要素比較時、3>2なので)

UFO演算子とも呼ばれる(見た目から?)、比較演算子。比較結果を数値で返す。
self <=> other -> -1 | 0 | 1 | nil
自身とotherの各要素を順に<=>で比較していき、下記のように値を返す。
selfがotherより大きいなら、1
selfとotherが等しいなら、0
selfがotherより小さいなら、-1
selfとotherが比較できない時は、nil

def xxx!

メソッド名の一部として末尾に「!」を付ける場合がある。慣用的には破壊的メソッドに対して付ける。
破壊的メソッドとは、レシーバであるオブジェクト自身を変更するメソッドのこと。

str = "test"
str.upcase
p str
=> "test"

str = "test"
str.upcase!
p str
=>"TEST"

なお下記のような「!」が付かない破壊的メソッドも存在するので注意。
insert・delete・push・replaceなど。
基本的には、自分で関数を定義する際に破壊的メソッドであれば末尾に「!」を付けておくのがベター(チームの慣習にもよるが)。