動かざることバグの如し

近づきたいよ 君の理想に

rubyで可変長引数を受け取るメソッドに配列で引数を渡す

常識すぎるのか、ググってもなかなか出てこなかったのでメモ

可変長引数とは

rubyでは仮引数名の頭に「*」をつけると可変長で受け取ることができる。

def myfunc(*args)
  p args
end

myfunc(1, "hello", true)
# => [1, "hello", true]

問題点

が、ここで配列をそのまま渡したらなんとかなるんじゃね?wとか思ってやってみたが、配列を1変数として受け取ってしまう(よく考えると当然である

myfunc([1, "hello", true])
# => [[1, "hello", true]]

解決策

渡す側にも「*」つけたらいけた

myfunc(*[1, "hello", true])
# => [1, "hello", true]

発端

そもそもこれを調べる理由として、RailsActiverecord

Post.all.pluck(:id,;title)

のようにするとそのカラムのデータだけ入った配列を取得できるので便利だったのだが、渡すカラム一覧をPost.column_namesのように配列で渡したかったって話

ソースコード見てもdef pluck(*keys) endだったのでこれでいけた

参考リンク

[ruby-list:45295] Re: メソッドの可変長引数に配列の全要素を渡したい