是否已经使用名称传递参数实现了while循环? :斯卡拉

时间:2019-05-24 09:52:06

标签: scala while-loop functional-programming pass-by-name

Scala的Scala之旅docs以whileLoop函数为例解释了传递名称的参数。

def whileLoop(condition: => Boolean)(body: => Unit): Unit =
  if (condition) {
    body
    whileLoop(condition)(body)
  }

var i = 2

whileLoop (i > 0) {
  println(i)
  i -= 1
}  // prints 2 1

本节说明,如果不满足条件,则不评估主体,从而通过不评估未使用的代码主体来提高性能。

Scala的while的实现是否已经使用了传递名字的参数?

如果有某种原因或特定情况下,实现无法使用传递名称的参数,请向我解释,到目前为止,我还没有找到任何信息。

编辑:根据Valy Dia(https://stackoverflow.com/users/5826349/valy-dia)的回答,我想补充一个问题...

如果在某些情况下可能根本不评估主体,则while语句的方法实现是否会比语句本身更好?如果是这样,为什么还要使用while语句?

我将尝试对此进行测试,但是我是Scala的新手,因此可能需要一些时间。如果有人想解释,那就太好了。

干杯!

2 个答案:

答案 0 :(得分:4)

while语句不是method,因此术语by-name参数并没有真正的意义……说了那么while语句具有以下结构:

while(condition){
  body
}

condition被反复评估,并且仅在condition被验证后才对主体进行评估,如以下小示例所示:

scala> while(false){ throw new Exception("Boom") }
// Does nothing

scala> while(true){ throw new Exception("Boom") }
// java.lang.Exception: Boom

scala> while(throw new Exception("boom")){ println("hello") }
// java.lang.Exception: Boom

答案 1 :(得分:4)

  

如果在某些情况下可能根本不评估主体,则while语句的方法实现是否会比语句本身更好?

不。内置的while也完全不评估主体,除非必须这样做,并且它将编译为效率更高的代码(因为它不需要引入“ thunks” / closures / lambdas /用于在后台实现“传递姓名”的匿名函数。

本书中的示例只是说明了如果没有内置的while语句,如何使用函数来实现它。

  

我假设他们还推断出while语句的主体将被评估是否满足条件

否,这将使内置while完全无用。那不是他们所追求的。他们想说的是,您可以使用“按名称调用”(而不是“按值调用”,而不是while循环做什么)来做这种事情,因为后者也是如此)。

主要收获是,您可以在Scala中构建类似于控件结构的东西,因为您具有语法糖,例如“按名称调用”和“带有功能的最后一个参数组可以用一个块调用”。