它们之间的区别是什么:
def even: Int => Boolean = _ % 2 == 0
和
val even: Int => Boolean = _ % 2 == 0
两者都可以像even(10)
一样调用。
发布于 2017-06-08 04:26:16
请看以下内容:
var x = 2 // using var as I need to change it to 3 later
val sq = x*x // evaluates right now
x = 3 // no effect! sq is already evaluated
println(sq)
令人惊讶的是,这将打印4而不是9!val (even var)立即求值并赋值。
现在将val更改为def。它将打印9!Def是函数调用..它将在每次调用时进行计算。
发布于 2018-01-14 12:21:55
val,即"sq“由Scala定义是固定的。它是在声明时计算的,您不能在以后更改它。在其他示例中,even2也是val类型,但它使用函数签名声明,即"(Int => Boolean)",因此它不是Int类型。它是一个函数,它的值通过以下表达式设置
{
println("val");
(x => x % 2 == 0)
}
根据Scala val属性,您不能将另一个函数赋给even2,这与sq规则相同。
为什么调用eval2 val函数没有一次又一次地打印"val“?
原始代码:
val even2: (Int => Boolean) = {
println("val");
(x => x % 2 == 0)
}
我们知道,在Scala的最后一条语句中,上面的表达式(里面是{ ..})实际上是返回到左侧。因此,您最终将even2设置为"x => x%2 == 0“函数,该函数与您为even2 val类型声明的类型相匹配,即(Int => Boolean),因此编译器很高兴。现在even2只指向"(x => x%2 == 0)“函数(而不是之前的任何其他语句,例如println("val")等。使用不同的参数调用event2将实际调用"(x => x%2 == 0)”代码,因为只有它与event2一起保存。
scala> even2(2)
res7: Boolean = true
scala> even2(3)
res8: Boolean = false
为了更清楚地说明这一点,下面是代码的不同版本。
scala> val even2: (Int => Boolean) = {
| println("val");
| (x => {
| println("inside final fn")
| x % 2 == 0
| })
| }
会发生什么呢?在这里,当您调用even2()时,我们一次又一次地看到"inside final fn“被打印出来。
scala> even2(3)
inside final fn
res9: Boolean = false
scala> even2(2)
inside final fn
res10: Boolean = true
scala>
发布于 2018-01-26 21:08:40
执行诸如def x = e
之类的定义将不会计算表达式e,而是在调用x时计算e。
或者,Scala提供了一个值定义val x = e
,它将计算右侧的值作为定义计算的一部分。如果随后使用x,则会立即将其替换为预先计算的e值,因此不需要再次计算该表达式。
https://stackoverflow.com/questions/18887264
复制相似问题