有什么区别:

def even: Int => Boolean = _ % 2 == 0

and

val even: Int => Boolean = _ % 2 == 0

两者都可以称为偶数(10)。


当前回答

在REPL,

scala> def even: Int => Boolean = { _% 2 == 0 }
even: Int => Boolean

scala> val even: Int => Boolean = { _% 2 == 0 }
even: Int => Boolean = $$Lambda$1157/1017502292@57a0aeb8

Def表示按名称调用,按需计算

Val表示在初始化时按值调用

其他回答

此外,Val是一个按值求值。这意味着右边的表达式在定义期间被求值。其中Def是通过名称求值。直到它被使用时才会计算。

在REPL,

scala> def even: Int => Boolean = { _% 2 == 0 }
even: Int => Boolean

scala> val even: Int => Boolean = { _% 2 == 0 }
even: Int => Boolean = $$Lambda$1157/1017502292@57a0aeb8

Def表示按名称调用,按需计算

Val表示在初始化时按值调用

除了上述有用的回复,我的发现是:

def test1: Int => Int = {
x => x
}
--test1: test1[] => Int => Int

def test2(): Int => Int = {
x => x+1
}
--test2: test2[]() => Int => Int

def test3(): Int = 4
--test3: test3[]() => Int

上面的例子表明,“def”是一个方法(参数为零),在调用时返回另一个函数“Int => Int”。

方法到函数的转换在这里有很好的解释:https://tpolecat.github.io/2014/06/09/methods-functions.html

看到这个:

  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(甚至var)立即计算并分配。 现在将val改为def..它将打印9!Def是一个函数调用。它将在每次调用时求值。

执行像def x = e这样的定义不会求表达式e的值。相反,每当x被调用时,e都会被求值。

或者,Scala提供了一个值定义 Val x = e,它计算右边的值作为定义值的一部分。 如果随后使用x,则立即用预先计算的e值替换它,这样表达式就不需要再次求值。