可変長引数やさまざまな引数の渡し方
Java 2013/09/21
引数の型と仮引数名の間に ...
と書くと、可変長引数になる。
メソッドの中では可変長引数は配列で参照できる。
public void foo(Object... args) {
// args は配列
}
Scala 2014/10/10
可変長引数のメソッド定義の例
def foo(args: Any*): Unit = {
...;
}
可変長引数のメソッドにSeq
型などのインスタンスを要素を展開して渡す例
foo(lst:_*);
名前渡しと可変長引数を組み合わせることはできないみたい。
def foo(args: => Any*): Unit = { # コンパイルエラー
...;
}
PHP 2014/06/17
可変長引数は、関数定義時には仮引数を書かずに、関数本体で func_get_args
関数などを呼び出すことで、引数を取得する。
PHP 5.6からは以下のような表記で可変長引数を取る関数を定義できるようになる。
function f($first, ...$tail) {
// $tail には配列で2つ目以降の引数が入る
...;
}
可変長引数リスト | PHP Manual
http://www.php.net/manual/ja/functions.arguments.php#functions.variable-arg-list
func_get_args
関数 | PHP Manual
http://www.php.net/manual/ja/function.func-get-args.php
Syntax for variadic functions
https://wiki.php.net/rfc/variadics
関数定義時の仮引数に &
を付けることでレファレンスにすることもできる。
function f(&$arg) {
$arg = ...;
}
レファレンスの引数は関数内で書き換えると、関数呼び出し元の引数にも反映される。
リファレンス渡し | PHP Manual
http://www.php.net/manual/ja/language.references.pass.php
Python 2013/10/10
仮引数名の前に *
を付けると、可変長引数になる。
関数の中ではその引数はタプルになる。
def foo(*args):
...
Ruby 2014/02/26
仮引数名の前に *
を付けると、可変長引数になる。
関数の中ではその引数は配列になる。
例:
def f(*args)
print "args:#{args}\n"
end
f(1, 2) # => a:[1, 2]
可変長引数は仮引数の中では最後である必要があるが、ブロックを受け取る引数がある場合は、ブロック引数が最後で、可変長引数はその前になる。
例:
def f(a, b, *args, &block)
...
end
ハッシュを使った名前付き引数もできる。
例:
def f(args)
p args
end
f(a: "a", b: 10)
# => {:a=>"a", :b=>10}
この呼び出し方は単にハッシュを引数にした以下の書き方と同じで、それの省略形が上の書き方で、結果的に名前付き引数のような使い方ができる。
f({a: "a", b: 10})
# => {:a=>"a", :b=>10}
名前付き引数は通常の引数よりも後ろにある必要がある。
可変長引数の逆で、複数の仮引数に対して関数呼び出し時に
配列でまとめて渡すこともできる。配列を関数に渡すときに *
をつけると、配列の各要素を関数の引数として展開されて渡される。
def f(a, b)
print "a:#{a} b:#{b}\n"
end
args = [1, 2]
f(*args); # => a:1 b:2
これらと同様のルールが変数への代入にも使える。
JavaScript 2015/11/16
関数定義の仮引数のところでどう書こうと、関数定義の中では arguments
というローカル変数で引数を配列として取得できる。
arguments
というローカル変数は特に宣言しなくても自動で使えるようになっている。
function f(a) {
console.log(a);
console.log(arguments);
}
f(1, 2, 3);
// 出力結果
// 1
// [1, 2, 3]
レファレンスによると arguments
は配列のようなものであって、配列ではないらしい。
arguments
| Mozilla Developer Network
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments