我试图理解"评估"的意思。
我正在学习Scala中的名字呼叫和价值呼叫,我对评估的含义感到困惑。编译器是为了理解我的代码而执行的,还是在实际调用方法之前执行/验证方法?
除评估策略外,我无法找到明确的解释。
您能解释以下示例的评估吗?
def callByValue(x : Unit) = {
for (i <- 0 until 5) {
print(x)
}
}
def callByName(x : => Unit) = {
for (i <- 0 until 5) {
print(x)
}
}
答案 0 :(得分:1)
让我们考虑一个更简单的例子。
@Html.DropDownList("Country", null, "Choose-Category", new {@class="form-control"})
请注意,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
会产生副作用。它打印出单词&#34; Value&#34;到STDOUT。单词&#34; Name&#34;没有打印。那是为什么?
这是因为调用方法时传递给callByValue()
的参数是评估(即执行)。 callByValue()
的参数在引用该参数callByName()
之前不会被评估,但它永远不会被引用,因为x
条件总是if
,{{1}永远不会执行子句,永远不会评估true
。
答案 1 :(得分:0)
..&#34;评估的含义&#34; ...编译器执行某些操作是为了理解我的代码,还是在实际调用方法之前执行/验证方法?
有很多很好的例子可以说明评估策略之间的差异,例如: @jwvh给出的那个。关于此主题还有一篇wikipedia文章。
在我看来,你对#34;评价&#34;这个词感到困惑。如果考虑使用解释器而不是编译器,也许更容易。解释器正在执行您的程序,也称为评估。例如,Python带有内置函数eval(以及&#34; exec&#34; btw)。
&#34;评估策略&#34;表示 或 解释器将如何执行/评估将返回实际参数值的代码。
对于编译的程序,这是相同的,除了编译器在生成可执行代码时做出这个决定(实际上程序员在定义函数时做了它)。