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

scala – 这两种声明函数的方法有什么区别?

发布时间:2020-12-16 18:20:41 所属栏目:安全 来源:网络整理
导读:遵循两个类似的函数,a和b,声明不同: scala val a = { x:Int = x+x }a: Int = Int = function1scala def b(x:Int) = x+xb: (x: Int)Int 我可以在两者之间找到的唯一区别是,只有使用def函数,我可以在传递参数时指定参数的名称(例如b(x = 1)).这些功能在其他方
遵循两个类似的函数,a和b,声明不同:

scala> val a = { x:Int => x+x }
a: Int => Int = <function1>

scala> def b(x:Int) = x+x
b: (x: Int)Int

我可以在两者之间找到的唯一区别是,只有使用def函数,我可以在传递参数时指定参数的名称(例如b(x = 1)).这些功能在其他方面有何不同?哪个应该用?

编辑:

我也无法使用val方法使用@tailrec注释.

解决方法

主要区别在于Scala如何翻译这些定义.在Scala中,lambda(匿名函数,函数值,函数文字)和方法是不同的东西.你的第一个定义是一个Function1类实例的糖,它是用于lambdas的类之一,第二个定义是周围对象的一个??方法,它编译成标准的Java方法.

两者之间的实际区别在于,Scala不能仅仅让您将方法称为值,这使得它成为二等公民.在处理更高阶函数时,这会导致冗余的间接.例如,以下内容:

1.to(4).map(b)

desugars到包装lambda:

1.to(4).map((x: Int) => b(x))

这本身就是一种糖:

1.to(4).map(
  new Function1[Int,Int] {
    def apply(x: Int): Int = b(x)
  }
)

感觉像是一种冗余,对吧?这就是为什么如果你对函数的意图是将它用作一等公民(即,作为值传递),从一开始就将它声明为lambda更为合理.

(编辑:李大同)

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

    推荐文章
      热点阅读