是否已经使用传递名称参数实现了 while 循环? : 斯卡拉
Is a while loop already implemented with pass-by-name parameters? : Scala
The Scala Tour Of Scala 文档使用 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://whosebug.com/users/5826349/valy-dia) 的回答,我想添加另一个问题...
如果在某些情况下可以完全不评估主体,那么 while 语句的方法实现是否会比语句本身执行得更好?如果是这样,为什么还要使用 while 语句?
我会尝试对此进行测试,但我是 Scala 的新手,因此可能需要一些时间。如果有人愿意解释,那就太好了。
干杯!
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
Would a method implementation of the while statement perform better than the statement itself if it's possible not to evaluate the body at all for certain cases?
没有。 built-in while
也根本不评估主体,除非它必须这样做,并且它将编译为更高效的代码(因为它不需要引入 "thunks"/closures/lambdas/anonymous 用于在后台实现 "pass-by-name" 的函数。
书中的示例只是展示了在没有 built-in while
语句的情况下如何使用函数实现它。
I assumed that they were also inferring that the while statement's body will be evaluated whether or not the condition was met
不,那会让 built-in while
完全没用。这不是他们的目的。他们想说你可以用 "call-by-name" 做这种事情(而不是 "call-by-value",而不是 while 循环所做的事情——因为后者也像那样工作)。
主要的收获是你可以在 Scala 中构建一些看起来像控制结构的东西,因为你有像 "call-by-name" 和 "last argument group taking a function can be called with a block".
这样的语法糖
The Scala Tour Of Scala 文档使用 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://whosebug.com/users/5826349/valy-dia) 的回答,我想添加另一个问题...
如果在某些情况下可以完全不评估主体,那么 while 语句的方法实现是否会比语句本身执行得更好?如果是这样,为什么还要使用 while 语句?
我会尝试对此进行测试,但我是 Scala 的新手,因此可能需要一些时间。如果有人愿意解释,那就太好了。
干杯!
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
Would a method implementation of the while statement perform better than the statement itself if it's possible not to evaluate the body at all for certain cases?
没有。 built-in while
也根本不评估主体,除非它必须这样做,并且它将编译为更高效的代码(因为它不需要引入 "thunks"/closures/lambdas/anonymous 用于在后台实现 "pass-by-name" 的函数。
书中的示例只是展示了在没有 built-in while
语句的情况下如何使用函数实现它。
I assumed that they were also inferring that the while statement's body will be evaluated whether or not the condition was met
不,那会让 built-in while
完全没用。这不是他们的目的。他们想说你可以用 "call-by-name" 做这种事情(而不是 "call-by-value",而不是 while 循环所做的事情——因为后者也像那样工作)。
主要的收获是你可以在 Scala 中构建一些看起来像控制结构的东西,因为你有像 "call-by-name" 和 "last argument group taking a function can be called with a block".
这样的语法糖