【问题标题】: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 &gt; 0 当然总是 true,因此这些方法都不能返回 x 值。

现在让我们打电话给他们。

callByValue(println("Value"))  // res0: Unit = ()
callByName(println("Name"))    // res1: Unit = ()

两个调用都返回(),这是Unit 类型的唯一值,但第一个callByValue() 有副作用。它将单词“Value”打印到 STDOUT。没有打印“名称”一词。这是为什么呢?

这是因为在调用方法时传递给callByValue() 的参数是求值(即执行)的。 callByName() 的参数在引用该参数 x 之前不会被评估,但它永远不会被引用,因为if 条件始终是trueelse 子句永远不会执行,并且x永远不会被评估。

【讨论】:

    【解决方案2】:

    ..“评估”的含义...是编译器为理解我的代码而执行的操作,还是在实际调用方法之前执行/验证方法?

    有很多很好的例子可以说明评估策略之间的差异,例如@jwvh 给出的那个。还有一篇关于这个主题的wikipedia 文章。

    在我看来,您对“评估”一词感到困惑。如果您考虑使用解释器而不是编译器,也许会更容易。解释器正在执行您的程序,也称为评估。例如 Python 带有一个内置函数 eval(以及“exec”顺便说一句)。

    “评估策略”表示何时如何解释器将执行/评估将返回实际参数值的代码。

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

    【讨论】:

      猜你喜欢
      • 2018-10-22
      • 2016-05-04
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 2019-06-27
      • 1970-01-01
      相关资源
      最近更新 更多