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

Scala中的函数与方法

发布时间:2020-12-16 09:46:26 所属栏目:安全 来源:网络整理
导读:我在看 Runar Bjarnason present Functional Programming for Beginners,在14:45他定义了一个方法: def isDivisibleBy(k: Int): Int = Boolean = i = i % k == 0 和一个功能: val isEven = isDivisibleBy(2) 将isEven定义为一种功能而不是一种方法的优缺
我在看 Runar Bjarnason present Functional Programming for Beginners,在14:45他定义了一个方法:

def isDivisibleBy(k: Int): Int => Boolean = i => i % k == 0

和一个功能:

val isEven = isDivisibleBy(2)

将isEven定义为一种功能而不是一种方法的优缺点是什么?

我已经阅读了Scala Functions vs Methods和Difference between method and function in Scala,并且我了解语义差异,但是我想知道在这种情况下是否有更深层次的原因,为什么一个函数可能是也可能不是更好的使用一个方法:

def isEven = isDivisibleBy(2)

解决方法

在引擎盖下,功能和方法之间还有其他差异。通常,普通方法比功能(其技术上是具有apply方法的对象)产生的开销更少。

然而,如果您不想关心这些差异,并将def,val和var视为具有不同语义的字段,那么只要在每次调用时都进行def评估,而val仅评估一次。

所以,val isEven = isDivisibleBy(2)在其定义期间应调用isDivisibleBy(2),并分配isDivisibleBy(2)的结果。例如。它取代了k

def isDivisibleBy(k: Int): Int => Boolean = i => i % k == 0

与2并分配最终表达式的结果(在这种情况下只有一个表达式):

val isEven: Int => Boolean = i => i % 2 == 0

def isEven另一方面没有这样的评估和结果调用isDivisibleBy(2)每次。

这意味着,以后,执行代码时,isEven(11)会在val的情况下生成

11 % 2 == 0

如果def,你会有

isDivisibleBy(2)(11)

只有在评估之后才可以得到结果。

您可以向isDivisibleBy添加一些调试代码来查看差异:

def isDivisibleBy(k: Int): Int => Boolean = {
  println("evaluating isDivisibleBy")
  i => i % k == 0
}

(编辑:李大同)

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

    推荐文章
      热点阅读