scala 中 'Array[Int]' 隐式转换为 'Int => Int' 的地方在哪里?

2024-05-10

这是一个问题this https://stackoverflow.com/questions/70000384/why-val-arr-int-int-array1-2-3-is-allowed-in-scala.
现在我们已经证明了Array[Int]可以隐式转换为Int => Int, but where发生的地点是什么?
明显地,Int => Int是一个函数:

scala> var fun = (i: Int) => Array(1,2,3)(i)
fun: Int => Int = <function1>

And Array[Int]是一个类:

scala> var arr = Array(1,2,3)
arr: Array[Int] = Array(1, 2, 3)

But arr可以分配给fun:

scala> fun = arr
fun: Int => Int = WrappedArray(1, 2, 3)

反之,则不会起作用:

scala> arr = fun
<console>:34: error: type mismatch;
 found   : Int => Int
 required: Array[Int]
       arr = fun
             ^

现在,那个地方在哪里implicit发生转换吗?


既然你有WrappedArray https://www.scala-lang.org/api/2.12.x/scala/collection/mutable/WrappedArray.html我猜你有 Scala 2.12 或更早版本 - Scala 2.13 有ArrayOps https://www.scala-lang.org/api/2.13.x/scala/collection/ArrayOps.html.

有一个隐式转换(实际上整个家庭 o 皈依 https://www.scala-lang.org/api/2.12.x/scala/Predef%24.html#genericWrapArray%5BT%5D(xs:Array%5BT%5D):scala.collection.mutable.WrappedArray%5BT%5D) from Array to WrappedArray。所以你有一个隐式转换Array[T] to WrappedArray[T].

Now, WrappedArray实现了 Scala 的各种集合特征。其中之一是Seq https://www.scala-lang.org/api/2.12.x/scala/collection/Seq.html实施PartialFunction(这反过来又延伸Function)。这意味着 Scala 中的所有集合都是来自某个键的函数 (Int在序列的情况下,可能是其他的情况Maps)。这包括WrappedArray.

所以你的转换为WrappedArray自动变成Array[T]进入一个(a的子类型)函数Int => T.

事实上,这就是为什么你应该避免放置任何集合(或隐式转换为集合的东西,例如Array2.13 之前)进入隐式作用域:隐式作用域中的集合自动变成隐式转换本身。这个问题仅在 Scala 3 中得到解决,隐式转换变成了的一个单独的子类型Function界面 https://docs.scala-lang.org/scala3/reference/contextual/conversions.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scala 中 'Array[Int]' 隐式转换为 'Int => Int' 的地方在哪里? 的相关文章

随机推荐