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

scala – 何时使用call-by-name和call-by-value?

发布时间:2020-12-16 09:02:15 所属栏目:安全 来源:网络整理
导读:我理解按名称调用和按值调用的基本概念,我也研究了一些例子.但是,我不清楚何时使用call-by-name.什么是真实世界的场景,其中呼叫名称将比其他呼叫类型具有显着的优势或性能增益?在设计方法时选择呼叫类型的正确思维方法应该是什么? 解决方法 有很多地方可以
我理解按名称调用和按值调用的基本概念,我也研究了一些例子.但是,我不清楚何时使用call-by-name.什么是真实世界的场景,其中呼叫名称将比其他呼叫类型具有显着的优势或性能增益?在设计方法时选择呼叫类型的正确思维方法应该是什么?

解决方法

有很多地方可以通过名字来获得性能甚至是正确性.

简单的性能示例:日志记录想象一下这样的界面:

trait Logger {
  def info(msg: => String)
  def warn(msg: => String)
  def error(msg: => String)
}

然后像这样使用:

logger.info("Time spent on X: " + computeTimeSpent)

如果info方法没有做任何事情(因为,例如,日志级别配置为高于此值),则不会调用computeTimeSpent,从而节省时间.对于记录器来说,这种情况发生了很多,其中人们经常看到字符串操作,相对于记录的任务而言,这可能很昂贵.

正确性示例:逻辑运算符.

您可能已经看过这样的代码:

if (ref != null && ref.isSomething)

说你声明&&像这样的方法:

trait Boolean {
  def &&(other: Boolean): Boolean
}

然后,只要ref为null,就会出现错误,因为isSomething将在传入&&之前在空引用上调用.因此,实际的声明是:

trait Boolean {
  def &&(other: => Boolean): Boolean =
    if (this) this else other
}

因此,实际上可能想知道何时使用按值调用.实际上,在Haskell编程语言中,一切都类似于按名称调用的方式(类似但不相同).

有充分的理由不使用call-by-name:它更慢,它创建了更多的类(意味着程序需要更长的时间来加载),它消耗更多的内存,并且它有很多不同,很多人都有很难推理它.

(编辑:李大同)

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

    推荐文章
      热点阅读