可変長引数
可変長引数の使い方。Javaのとだいたい同じ感じです。
- 引数に「*」をつけると可変長引数となります。
- 可変長引数とされた場合、関数呼び出し時に指定された引数のうち、普通のをのぞいた残りの引数が配列に格納されて関数に渡されます。
- 関数内では可変長引数は配列として扱えます。[index]で値を参照したり、sizeで要素数を取得したりできます。
- 引数が余らなかった場合は、空の配列が渡されます。
- 関数が受けつける引数のうち、最後の引数のみ、可変長引数にできます。
# 可変長引数の関数。 def foo( *args ) puts "--" puts args.class # 引数が配列で渡される。 puts args.join(",") puts args.length # 配列なので配列のメソッドが使える。 end foo( "a", "b", "c" ) foo("a") # 引数がひとつでも配列で渡される foo() # 引数なしでも配列で渡される # 普通の引数 + 可変長引数 def var( name, *args ) puts "--" puts name puts args.join(",") end var( "a", "b", "c" ) # 第一引数が"a", 残りは配列で渡される。 var("a") # 第一引数が"a",可変長部分はないので空の配列が渡される。 #var() # これはエラー # 可変長引数は最後の引数限定。Javaと同じ。 #def var( *args, name ); end
実行結果です。
-- Array a,b,c 3 -- Array a 1 -- Array 0 -- a b,c -- a
また、関数呼び出し時の配列引数に「*」をつけると、配列を展開した値が引数として渡されます。
# 関数呼び出し時の配列引数で*を使用すると、配列を展開した値が引数として渡される。 def hoge( a, b, c ) puts a << b << c end hoge( *["a", "b", "c"] ) # これは↓と同じ。 hoge( "a", "b", "c" ) #hoge( ["a", "b", "c"] ) # これはもちろんエラーですよ。
実行結果。
abc abc
可変長引数を受けとる関数から、可変長引数を受けとる関数を呼び出すときに使えます。
# 関数から、可変長引数を受けとる関数を呼び出すときに使える。 def foo2( *args ) args << "x" # 引数に"x"を追加 foo( *args ) # 元の任意の個数の引数+"x"を引数としてfooを呼び出す。 end foo2( "a", "b", "c" )
実行結果です。
-- Array a,b,c,x 4