"评估"的含义

时间:2017-07-29 08:32:38

标签: scala function methods evaluation

我试图理解"评估"的意思。

我正在学习Scala中的名字呼叫和价值呼叫,我对评估的含义感到困惑。编译器是为了理解我的代码而执行的,还是在实际调用方法之前执行/验证方法?

除评估策略外,我无法找到明确的解释。

您能解释以下示例的评估吗?

 def callByValue(x : Unit) = {
    for (i <- 0 until 5) {
      print(x)
    }
  }

  def callByName(x : => Unit) = {
    for (i <- 0 until 5) {
      print(x)
    }
  }

2 个答案:

答案 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;表示 解释器将如何执行/评估将返回实际参数值的代码。

对于编译的程序,这是相同的,除了编译器在生成可执行代码时做出这个决定(实际上程序员在定义函数时做了它)。