Ruby

コード読んでて、思わず調べたRubyの記法いくつか

More than 3 years have passed since last update.

最近Rubyを書き始めました。Rubyで書かれたプログラムのコードを読んでいると、たまに「何だこれは..」となる記述に出くわすことがあるので、その時調べたもののメモ。


||=

値がnilの場合、右辺の値を代入して初期化してくれます。

以下のような動きをします。


a.rb

hoge = nil

hoge ||= "fuga"
p hoge #=> "fuga"

nilでないときは代入しません。


b.rb

hoge = "piyo"

hoge ||= "fuga"
p hoge #=> "piyo"

←[追記]

※falseの時にも代入されます。

hoge = false

hoge ||= "fuga"
p hoge #=> "fuga"


<=>

「UFO演算子」と呼ばれる比較演算子です。比較結果を数値で返してくれます。


  • 左辺が大きければ1を返す

  • 右辺が大きければ-1を返す

  • 等しければ0を返す

100 <=> 10 #=> 1

100 <=> 200 #=> -1
100 <=> 100 #=> 0


<<

配列で自信の末尾に破壊的に値を追加してくれます。

array = [1, 2, 3, 4]

array << 5
p array #=> [1, 2, 3, 4, 5]


::

定数のスコープ演算子です。::を使って定数を呼び出せます。


a.rb

class Hoge

FUGA = "piyo"
end

p Hoge::FUGA #=> "piyo"


こっちは定数でないので動きません。


b.rb

class Hoge

fuga = "piyo"
end

p Hoge::fuga #=> "piyo"



..

「範囲演算子」というもので、範囲オブジェクトを作ってくれます。


a.rb

p (0..10).to_a #=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


これは「…」だと最大値を含みません。


b.rb

p (0...10).to_a #=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]



? (メソッド名に付く場合)

慣用的に真偽値を返すメソッド名で使われるようです。

def foo?

true
end

p foo? #=> true
# 否定と組み合わせて
p !foo? #=> false
# これは以下のように書き換えることも出来ます
p foo?.! #=> false


! (メソッド名につく場合)

「破壊的メソッド」と呼ばれるのメソッド名などで見かけます。

!が付くか付かないかでは挙動が違うメソッドがいくつかあるので注意が必要です。

例えばString#chop!などの破壊的メソッドは、他の変数の参照先についても影響を与えてしまいます。


chop.rb

hoge = "hoge"

fuga = hoge

hoge.chop
p fuga #=> "hoge"
hoge.chop!
p fuga #=> "hog"



参考