gpt4 book ai didi

scala - Scala 中的 eta 展开式是什么?

转载 作者:行者123 更新时间:2023-12-01 23:30:09 25 4
gpt4 key购买 nike

我是 Scala 新手。我刚刚听到“eta扩展”这个词,大致知道它的意思是将方法扩展为函数对象。但我在SO中发现很少有资源系统地介绍它。

我很好奇 eta 扩展在 Scala 中是如何工作的。哪些场景需要进行eta扩容? Scala 中eta 扩展是如何实现的?

我大致知道在这样的情况下:

def someMethod(x: Int): Int = x * x

someMethod _ 将粗略地转换为一个新的函数对象,如下所示:

new Function1[Int, Int] {
def apply(x: Int): Int = x * x
}

这就是 Scala 所做的一切吗?

最佳答案

http://scala-lang.org/files/archive/spec/2.11/06-expressions.html#method-values 中给出了定义和一些示例。 .

someMethod _ will roughly be translated to a new function object like this:

不完全是:实际上是这样

new Function1[Int, Int] {
def apply(x: Int): Int = someMethod(x)
}

差异很重要,例如如果 someMethod 在某处被重写。

Is it all that Scala does?

您还需要考虑如果该方法采用多个参数列表(您得到一个返回函数的函数)或按名称参数会发生什么情况。

What are the scenarios that eta expansion are needed?

  1. 当您特别要求时(例如 someMethod _)。

  2. 当您使用需要函数类型(或 Scala 2.12 中的 SAM 类型)值的方法(带参数)时。例如

    def foo(f: Int => Int) = ???

    foo(someMethod)
  3. 就是这样。

请注意,由于类型推断、隐式等原因,使用 eta 扩展和带有占位符的匿名函数 (someMethod(_)) 的行为可能会有所不同。

关于scala - Scala 中的 eta 展开式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39445018/

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