アトトック代表の開発ブログ

プログラミングや会社のこと、写真、自転車のことなど書いてます。

Rubyの可変長引数

Rubyでメソッドに可変長引数を渡したい場合は、引数の前に*を付けます。

普通の引数と可変長引数を受け取るメソッドと可変長引数だけ受け取るメソッドで動作確認してみます。
下記のサンプルのfunc1では2つ目までの引数を必須にし、そのあとの引数を可変にしています。
func2では全ての引数を可変にしています。

サンプルコード

#
# 普通の引数と可変長引数を受け取るメソッド
#
def func1(arg1, arg2, *args)
  puts '<<<<< func1 >>>>>'
  puts "arg1 : #{arg1}"
  puts "arg2 : #{arg2}"
  puts "args : #{args}"
  puts "args.class : #{args.class}"
  puts
end

#
# 可変長引数だけ受け取るメソッド
#
def func2(*args)
  puts '<<<<< func2 >>>>>'
  puts "args : #{args}"
  puts "args.class : #{args.class}"
  puts
end

func1('test-1-1', 'test-1-2', 'a')

func1('test-2-1', 'test-2-2', 'a', 'b', 'c', 1, 2, 3)

func1('test-3-1', 'test-3-2')

# 固定引数を渡さないと例外が発生する
begin
  func1()
rescue Exception => e
  puts "例外発生 : #{e}"
  puts "例外クラス : #{e.class}"
end

# こっちは可変引数なので引数なしでもOK
func2()

func2('a')

func2('a', 'b', 'c', 1, 2, 3)

実行結果を確認すると可変引数の方はArrayになっています。
固定引数と可変長引数を渡したい場合は、func1のように可変長引数の前に固定の引数を渡ます。
func2の引数は可変引数のみなので引数なしで呼び出しても例外は発生しませんが、 func1には固定引数があるので引数なしで呼び出すとArgumentErrorが発生します。

実行結果

<<<<< func1 >>>>>
arg1 : test-1-1
arg2 : test-1-2
args : ["a"]
args.class : Array

<<<<< func1 >>>>>
arg1 : test-2-1
arg2 : test-2-2
args : ["a", "b", "c", 1, 2, 3]
args.class : Array

<<<<< func1 >>>>>
arg1 : test-3-1
arg2 : test-3-2
args : []
args.class : Array

例外発生 : wrong number of arguments (given 0, expected 2+)
例外クラス : ArgumentError
<<<<< func2 >>>>>
args : []
args.class : Array

<<<<< func2 >>>>>
args : ["a"]
args.class : Array

<<<<< func2 >>>>>
args : ["a", "b", "c", 1, 2, 3]
args.class : Array