可変長引数やさまざまな引数の渡し方

Java

引数の型と仮引数名の間に ... と書くと、可変長引数になる。

メソッドの中では可変長引数は配列で参照できる。

public void foo(Object... args) {
    // args は配列
}

Scala

可変長引数のメソッド定義の例

def foo(args: Any*): Unit = {
    ...;
}

可変長引数のメソッドにSeq型などのインスタンスを要素を展開して渡す例

foo(lst:_*);

名前渡しと可変長引数を組み合わせることはできないみたい。

def foo(args: => Any*): Unit = {  # コンパイルエラー
    ...;
}

PHP

可変長引数は、関数定義時には仮引数を書かずに、関数本体で 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

仮引数名の前に * を付けると、可変長引数になる。

関数の中ではその引数はタプルになる。

def foo(*args):
    ...

Ruby

仮引数名の前に * を付けると、可変長引数になる。

関数の中ではその引数は配列になる。

例:

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

関数定義の仮引数のところでどう書こうと、関数定義の中では 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

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク