search
LoginSignup
246

More than 5 years have passed since last update.

posted at

updated at

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

最近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"

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
246