加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:02:09 所属栏目:安全 来源:网络整理
导读:我刚开始使用 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") 相应
我刚开始使用 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读