我刚开始使用
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中任何相关要点的指示.谢谢!