循环被定义为如下:
def loop : Boolean = loop
当x被定义为: def x = loop
则“X:布尔”示于控制台。
和
当x被定义为: val x = loop
然后它进入无限循环
我知道高清使用呼叫按姓名和Val是利用价值的通话。 尽管这一点对环以上定义并不多清楚。
循环被定义为如下:
def loop : Boolean = loop
当x被定义为: def x = loop
则“X:布尔”示于控制台。
和
当x被定义为: val x = loop
然后它进入无限循环
我知道高清使用呼叫按姓名和Val是利用价值的通话。 尽管这一点对环以上定义并不多清楚。
def
不计算分配的右手边。 就像
def f(x : Int) = x + 2
不(在这种情况下,逻辑上不能)评估f
的任何东西,只是定义了功能f
,意味着,无论是def loop : Boolean = loop
也不def x = loop
评价什么。 你只是限定了一些其他的点要执行的功能。
但val
就做需要转让的右侧进行评估。 所以val x = loop
尝试在右手侧执行的表达。 试图评估loop
永远不会终止,不过,因为loop
是一个无限循环。
呼叫按姓名或致电按值的区别,似乎在这种情况下用处不大,因为无论你的x
,也不是你loop
带任何参数。
但也有其他两种方式val
和def
不同。
首先区别是:渴望主场迎战懒惰。
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 }
但由于loop
是def
的,因此懒惰,右手边是不是当你定义它评估。
如果你现在定义
def x = loop
什么也没发生的是,因为x
也懒,所以右侧再次未评估。
但是,如果你定义
val x = loop
然后x
是一个val
,因而其右手侧被急切地进行评价。 在定义的右手边,有一个调用loop
。 现在, loop
被访问,因为它是一个def
,现在评估其身体,并进入一个无限循环。