在斯卡拉DEF和Val之间的区别(Difference between def and val in

2019-09-28 22:12发布

循环被定义为如下:

 def loop : Boolean = loop

当x被定义为: def x = loop则“X:布尔”示于控制台。

当x被定义为: val x = loop然后它进入无限循环

我知道高清使用呼叫按姓名和Val是利用价值的通话。 尽管这一点对环以上定义并不多清楚。

Answer 1:

def不计算分配的右手边。 就像

def f(x : Int) = x + 2

不(在这种情况下,逻辑上不能)评估f的任何东西,只是定义了功能f ,意味着,无论是def loop : Boolean = loop也不def x = loop评价什么。 你只是限定了一些其他的点要执行的功能。

val就做需要转让的右侧进行评估。 所以val x = loop尝试在右手侧执行的表达。 试图评估loop永远不会终止,不过,因为loop是一个无限循环。



Answer 2:

呼叫按姓名或致电按值的区别,似乎在这种情况下用处不大,因为无论你的x ,也不是你loop带任何参数。

但也有其他两种方式valdef不同。

首先区别是:渴望主场迎战懒惰。

  • 的右手侧val被尽快热切评价, val定义
  • 的右手侧def被尽快懒惰地评估, def访问

例如:

def x = { println("x is evaluated"); 42 } 
val y = { println("y is evaluated"); 42 }
x

将打印:

y is evaluated
x is evaluated

因为y立即进行评估,而x只有当我们把它进行评估。

另一个区别是计算的结果是否缓存与否:

  • val计算一次 ,然后缓存
  • def评估我们每次调用函数

这就是为什么

def dice = { new scala.util.Random().nextInt(6) + 1 }
val once = { new scala.util.Random().nextInt(6) + 1 }

println(dice + " <-> " + once)
println(dice + " <-> " + once)
println(dice + " <-> " + once)
println(dice + " <-> " + once)

将输出:

5 <-> 6
4 <-> 6
6 <-> 6
5 <-> 6

也就是说, dice是生成值的更多或更少的有用的随机数发生器1-6 ,而once是一旦它创建了被固定的,而没用随机值。


现在,你可以用渴望-VS-懒认为一个2x2表的一名维和缓存-VS-不缓存另:

  • val 渴望缓存
  • lazy val缓存 (从而被memoized def S)
  • def懒惰未缓存
  • 是不是真的渴望未缓存 ,因为计算的东西,然后马上把它扔了是不是很有用。 也许有一个例外,那得八九不离十:程序的入口点,因为即使def main是一种def ,它总是被称为无论如何,所以从某种意义上讲它是一种-既渴望和未缓存。

在你的代码, loop基本上是无终止的尾递归版本

def loop: Boolean = { while (true) {}; true }

但由于loopdef的,因此懒惰,右手边是不是当你定义它评估。

如果你现在定义

def x = loop

什么也没发生的是,因为x也懒,所以右侧再次未评估。

但是,如果你定义

val x = loop

然后x是一个val ,因而其右手侧被急切地进行评价。 在定义的右手边,有一个调用loop 。 现在, loop被访问,因为它是一个def ,现在评估其身体,并进入一个无限循环。



文章来源: Difference between def and val in Scala
标签: scala