gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:24:53 24 4
gpt4 key购买 nike

this后面是一道题.
现在我们已经证明了 Array[Int] 可以隐式转换为 Int => Int,但是发生的地方是哪里
显然,Int => Int 是一个函数:

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

Array[Int]是一个类:

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

但是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
^

现在,隐式转换发生的地方在哪里?

最佳答案

既然你有WrappedArray我猜你有 Scala 2.12 或更早版本 - Scala 2.13 有 ArrayOps .

存在从ArrayWrappedArray 的隐式转换(实际上是a whole family o conversions)。所以你有一个从 Array[T]WrappedArray[T] 的隐式转换。

现在,WrappedArray 实现了各种 Scala 的集合特征。其中之一是 Seq实现 PartialFunction(进而扩展 Function)。这意味着 Scala 中的所有集合都是来自某个键的函数(Int 在序列的情况下,可能是其他的在 Map 的情况下)。这包括 WrappedArray

因此,您对 WrappedArray 的转换会自动将 Array[T] 转换为(a 的子类型)函数 Int => T

事实上,这就是为什么你应该避免将任何集合(或在 2.13 之前可隐式转换为集合的事物,如 Array)放入隐式范围的原因:隐式范围中的集合自动成为隐式转换本身。此问题仅在 Scala 3 中得到解决,其中隐式转换变为 a separate subtype of Function interface .

关于scala - 'Array[Int]'在scala中隐式转换为 'Int => Int'的地方在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70016392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com