川のブログ

川の適当気ままなブログです。 

Ruby 多重代入

こんにちはかわです。

アドベントカレンダー11記事目です。

書きます。

何をするか

この本を大分前に買って読んでた。

読みきれてなく覚えておきたいことを記憶する目的で書く。

現在は第二版が出ているが、基礎的な部分は変わらないので学習する。

リファレンスも参考にしている

docs.ruby-lang.org

実行環境

Ruby 2.4.2

多重代入

左辺と右辺の式をカンマで区切ることでそれぞれに代入
a, b = 1, 2 
a # => 1
b # => 2

その際右辺は配列に変換されて代入される。

上記の状態で右辺を配列にしても代入可能
a, b = [1, 2]
a # => 1
b # => 2
左辺で余った変数にはnil
a, b = 1
a # => 1
b # => nil
右辺で余った要素は無視
a, b = 1, 2, 3
a # => 1
b # => 2
左辺の最後の式に*をつけることで、余った要素を配列として代入
a, *b = 1, 2, 3
a # => 1
b # => [2, 3]
右辺の先頭要素だけを代入
a , = 1, 2, 3
a # => 1

a, * = 1, 2, 3
a # => 1

#おまけ
a = 1, 2, 3
a # => [1, 2, 3]
右辺末尾だけ代入
* , a = 1, 2, 3
a # => 3
要素すべてを削除
* = 1, 2, 3

#使いみち
#メソッドの引数を無視したいときに使用

def test1(*)
  puts "OK"
end

def test2
  puts "OK?"
end

test1(1, 2) # => nil "OK"が出力
test2(1, 2) # => ArgumentError: wrong number of arguments (given 2, expected 0)
右辺に配列がある場合,左辺を()でネストすることで代入可能
a, (b, c) = 1, [2, 3]
a # => 1
b # => 2
c # => 3

以上です。