Pythonの人々のために:
Scalaの_*
演算子は、Pythonの*-演算子とほぼ同等です。
例
Luigi Plingeが提供するリンクからscalaの例を変換する:
def echo(args: String*) =
for (arg <- args) println(arg)
val arr = Array("What's", "up", "doc?")
echo(arr: _*)
Pythonでは次のようになります。
def echo(*args):
for arg in args:
print "%s" % arg
arr = ["What's", "up", "doc?"]
echo(*arr)
両方とも次の出力を提供します。
何
アップ
ドキュメントは?
違い:位置パラメータの解凍
Pythonの*
演算子は、位置パラメーター/固定アリティ関数のパラメーターのアンパックも処理できます。
def multiply (x, y):
return x * y
operands = (2, 4)
multiply(*operands)
8
Scalaで同じことをする:
def multiply(x:Int, y:Int) = {
x * y;
}
val operands = (2, 4)
multiply (operands : _*)
失敗します:
メソッドmultiplyの引数が足りません:(x:Int、y:Int)Int。
不特定の値パラメーターy。
しかし、scalaで同じことを達成することは可能です:
def multiply(x:Int, y:Int) = {
x*y;
}
val operands = (2, 4)
multiply _ tupled operands
Lorrin Nelsonによると、これはどのように機能するかです。
最初の部分f_は、引数が指定されていない部分的に適用された関数の構文です。これは、関数オブジェクトを取得するためのメカニズムとして機能します。tupledは、単一のarity-nタプルをとるarity-1の新しい関数を返します。
さらに読む:
def sum(xs: _*)
'エラー:バインドされていないワイルドカードタイプ'をスローします