功能 – 为什么Scala类方法不是一等公民?

前端之家收集整理的这篇文章主要介绍了功能 – 为什么Scala类方法不是一等公民?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚开始使用 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会产生错误,因为显然方法不能像函数那样成为值.但我仍然可以将方法作为参数传递.我在以下代码片段中演示了这一点,改编自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

>方法 – 不是一流的限制,可能是Scala的JVM交互所强加的,还是它是语言设计的决定?
>为什么我需要像在merp3中一样滚动自己的eta abstractions
> merp4也是eta abstraction,还是偷偷摸摸的相似?
>为什么我的etaAbstractor工作? Scala是否正在用intCombiner安静地替换intCombiner?

欢迎理论,计算机科学的答案,以及language specification中任何相关要点的指示.谢谢!

解决方法

免责声明:我不是计算机科学家,但我会猜测:

> Method是对象的一部分,不存在于对象之外.你不能单独传递方法. Closure是封装状态的另一种(等效?)方式,通过将对象方法转换为独立函数(在Scala中使用apply()方法的另一个对象),您创建了一个闭包.这个过程称为eta-expansion. §3.3.1,§6.26.5
>你不必.你也可以写val merp3:(String => String)= merp. §6.26.5
>是的,merp4也是eta-expansion. §6.7
> §6.26.2

猜你在找的Scala相关文章