Scala Splat 内部工作原理
Scala Splat inner workings
我知道在 scala 中我可以说
def foo(x: Int*) ...
foo(Seq(1,2,3): _*)
但我不能说
foo(Seq(1,2,3))
所以必须进行一些隐式转换。这个隐式转换是什么?使这种情况发生的实际方法是什么。或者,如果我错了,它实际上是如何工作的?
当您将 Seq
与类型注释 _*
一起使用时,没有隐式转换,因为重复的参数基本上已经是 Seq
。
但是,如果你使用Array
,那么就会有一个隐式转换,而
foo(Array(1,2,3): _*)
会是
foo(wrapIntArray(Array(1,2,3)):_*)
wrapIntArray
是在Predef
.
中定义的隐式函数
implicit def wrapIntArray(xs: Array[Int]): ArraySeq.ofInt
至于为什么后一个(没有类型注释)不被接受,我猜这只是一种设计选择,而不是让开发人员对它的工作原理感到困惑:)。
我知道在 scala 中我可以说
def foo(x: Int*) ...
foo(Seq(1,2,3): _*)
但我不能说
foo(Seq(1,2,3))
所以必须进行一些隐式转换。这个隐式转换是什么?使这种情况发生的实际方法是什么。或者,如果我错了,它实际上是如何工作的?
当您将 Seq
与类型注释 _*
一起使用时,没有隐式转换,因为重复的参数基本上已经是 Seq
。
但是,如果你使用Array
,那么就会有一个隐式转换,而
foo(Array(1,2,3): _*)
会是
foo(wrapIntArray(Array(1,2,3)):_*)
wrapIntArray
是在Predef
.
implicit def wrapIntArray(xs: Array[Int]): ArraySeq.ofInt
至于为什么后一个(没有类型注释)不被接受,我猜这只是一种设计选择,而不是让开发人员对它的工作原理感到困惑:)。