私は突然この(私には予期しない)状況に遭遇しました:
def method[T](x: T): T = x
scala> method(1)
res4: Int = 1
scala> method(1, 2)
res5: (Int, Int) = (1,2)
2つ以上のパラメーターの場合、メソッドはタプルを返し、推測しますが、パラメーターリストに関するエラーをスローするのはなぜですか?意図的ですか?たぶん、この現象には名前がありますか?
これがscalaコンパイラからの抜粋です:
/** Try packing all arguments into a Tuple and apply `fun'
* to that. This is the last thing which is tried (after
* default arguments)
*/
def tryTupleApply: Option[Tree] = ...
そしてここに関連する問題があります:スペックは自動タプリングについて言及していません
これはすべて、上記の例(1つの引数の型パラメーター化されたメソッド)で、scalaがパラメーターをタプルにパックし、そのタプルに関数を適用しようとすることを意味します。さらに、この2つの短い情報から、この動作は言語仕様に記載されていないと結論付けることができ、自動タプリングの場合にコンパイラの警告を追加することについて議論されています。そして、これは自動タッピングと呼ばれるかもしれません。
% scala2.10 -Xlint
scala> def method[T](x: T): T = x
method: [T](x: T)T
scala> method(1)
res1: Int = 1
scala> method(1, 2)
<console>:9: warning: Adapting argument list by creating a 2-tuple: this may not be what you want.
signature: method[T](x: T): T
given arguments: 1, 2
after adaptation: method((1, 2): (Int, Int))
method(1, 2)
^
res2: (Int, Int) = (1,2)