関数(サブルーチン)の引数を追加できるという動的型言語の利点

Perlを始めとする動的型言語の関数(サブルーチン)の引数の個数は動的であり、サブルーチンの実装をした後でも、引数を追加することができます。

これは、サブルーチンの定義が修正されても、元の関数呼び出しを修正する必要がないということを意味します。

# 最初は一つの引数
sub func {
  my ($arg) = @_;
}

# 呼び出し
func(1);

ここで、このサブルーチンにオプションが必要になったとしましょう。この場合、元の呼び出し個所を修正する必要がありません。

# オプションを追加
sub func {
  my ($arg, $opt) = @_;
  
  $opt ||= {};
}

# 元の呼び出しは、修正しなくてよい
func(1);

# オプション付き呼び出し
func(1, {foo => 4});

静的型言語で実現するにはどのような手法が考えられますか?

たとえば、JavaやC++のオーバーロード機能を使えば、元の呼び出しを壊すことなく、同じ名前で、引数の個数を変えて、新しいメソッドを定義できます。

ただし、この場合は、メソッドを新しく定義したので、メソッド定義の個数が増えます。

元のメソッド自体の引数を増やしたのではないことに注意してください。

関連情報