【发布时间】:2015-08-10 07:30:20
【问题描述】:
我刚刚开始使用 Scala 并正在修改工作表。例如:
def merp(str: String) : String = s"Merrrrrrrp $str"
val merp2 = (str: String) => s"Merrrrrrrp $str"
val merp3 = (str: String) => merp(str)
val merp4 = merp _
merp("rjkghleghe")
merp4("rjkghleghe")
以及对应的工作表结果:
merp: merp[](val str: String) => String
merp2: String => String = <function1>
merp3: String => String = <function1>
merp4: String => String = <function1>
res0: String = Merrrrrrrp rjkghleghe
res1: String = Merrrrrrrp rjkghleghe
说,例如,val merp5 = merp 会产生错误,因为显然方法不能像函数那样是值。但我仍然可以将方法作为参数传递。我在下面的代码 sn-p 中演示了这一点,改编自a similar SO question:
def intCombiner(a: Int, b: Int) : String = s"herrrrrrp $a derrrrrrp $b"
def etaAbstractor[A, B](combineFoo: (A, B) ⇒ String, a: A, b: B) = combineFoo(a, b)
etaAbstractor(intCombiner, 15, 16)
工作表结果:
intCombiner: intCombiner[](val a: Int,val b: Int) => String
etaAbstractor: etaAbstractor[A,B](val combineFoo: (A, B) => String,val a: A,val b: B) => String
res10: String = herrrrrrp 15 derrrrrrp 16
- method-not-being-first-class 是一种限制,可能是由 Scala 的 JVM 交互强加的,还是语言设计中的决定?
- 为什么我需要像
merp3一样滚动我自己的eta abstractions? -
merp4也是 eta abstraction,还是有点相似? - 为什么我的
etaAbstractor有效? Scala 是否正在悄悄地将intCombiner替换为intCombiner _?
欢迎提供理论、计算机科学的答案,以及指向language specification 中任何相关点的指针。谢谢!
【问题讨论】:
-
Scala 的设计和实现 在许多领域都与 Java/JVM 兼容性密切相关——我敢肯定,如果没有这些,差异会更小,但你d 必须问 Martin(我认为他有时会访问 SO)或找到一些较早的 impl 注释。尽管可以使用
method _轻松“提升”它们。