【问题标题】:Meaning of "Evaluation" [duplicate]“评估”的含义[重复]
【发布时间】:2018-01-05 07:55:44
【问题描述】:
我正在尝试理解“评估”的含义。
我正在学习 Scala 中的名称调用和值调用,但我对评估的含义感到困惑。是编译器为了理解我的代码而执行的操作,还是在实际调用方法之前执行/验证方法?
除了评估策略,我找不到明确的解释。
你能解释一下下面例子的评估吗?
def callByValue(x : Unit) = {
for (i <- 0 until 5) {
print(x)
}
}
def callByName(x : => Unit) = {
for (i <- 0 until 5) {
print(x)
}
}
【问题讨论】:
标签:
scala
function
methods
evaluation
【解决方案1】:
让我们考虑一个更简单的例子。
def callByValue(x : Unit) = if (1 > 0) () else x
def callByName(x : => Unit) = if (1 > 0) () else x
请注意,1 > 0 当然总是 true,因此这些方法都不能返回 x 值。
现在让我们打电话给他们。
callByValue(println("Value")) // res0: Unit = ()
callByName(println("Name")) // res1: Unit = ()
两个调用都返回(),这是Unit 类型的唯一值,但第一个callByValue() 有副作用。它将单词“Value”打印到 STDOUT。没有打印“名称”一词。这是为什么呢?
这是因为在调用方法时传递给callByValue() 的参数是求值(即执行)的。 callByName() 的参数在引用该参数 x 之前不会被评估,但它永远不会被引用,因为if 条件始终是true,else 子句永远不会执行,并且x永远不会被评估。
【解决方案2】:
..“评估”的含义...是编译器为理解我的代码而执行的操作,还是在实际调用方法之前执行/验证方法?
有很多很好的例子可以说明评估策略之间的差异,例如@jwvh 给出的那个。还有一篇关于这个主题的wikipedia 文章。
在我看来,您对“评估”一词感到困惑。如果您考虑使用解释器而不是编译器,也许会更容易。解释器正在执行您的程序,也称为评估。例如 Python 带有一个内置函数 eval(以及“exec”顺便说一句)。
“评估策略”表示何时或如何解释器将执行/评估将返回实际参数值的代码。
对于已编译的程序,这是相同的,只是编译器在生成可执行代码时做出了这个决定(实际上是程序员在定义函数时做出的)。