15

与えられた例:

scala> def pipes(strings:String*) = strings.toList.mkString("|")

私は通常呼び出すことができます:

scala> pipes("foo", "bar")
res1: String = foo|bar

またはスプラットで:

scala> val args = List("a","b","c")
scala> pipes(args:_*)
res2: String = a|b|c

しかし、splat を使用して、varargs パラメーター以外の引数を指定することはできますか? たとえば、次のようなことをしたいと思います:

scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s
scala> val args:Tuple2[Int, String] = (1, "two")
scala> pipeItAfterIncrementing(args:_*)

それは機能しませんが、タプルであろうと他のものであろうと、単一のオブジェクトから複数の引数を提供するという同じ効果を達成する方法はありますか? タプルの長さとタイプの両方がコンパイル時にわかっている場合、これをタプルに実装できない理由はありますか?

4

2 に答える 2

22

Function.tupledこれを正確に行うためにを使用できます: n 個の引数を取る関数を、アリティnの単一のタプル引数を取る関数に変換します。予想どおり、Function.untupled逆の仕事をします。

特殊な型の割り当て: _*は、繰り返しパラメーター (別名 varargs) にのみ適用されます。

scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s
pipeItAfterIncrementing: (i: Int,s: String)java.lang.String

scala> def tupledPipeItAfterIncrementing = Function.tupled(pipeItAfterIncrementing _)
tupledPipeItAfterIncrementing: ((Int, String)) => java.lang.String

scala> val args:Tuple2[Int, String] = (1, "two")
args: (Int, String) = (1,two)

scala> tupledPipeItAfterIncrementing(args)
res0: java.lang.String = 2|two
于 2011-04-13T12:51:03.960 に答える
13

そうですね...

scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s
scala> val args:Tuple2[Int, String] = (1, "two")
scala> (pipeItAfterIncrementing _).tupled(args)

あなたに希望を与えます2|two

于 2011-04-13T12:55:29.893 に答える