有什么区别:
def even: Int => Boolean = _ % 2 == 0
and
val even: Int => Boolean = _ % 2 == 0
两者都可以称为偶数(10)。
有什么区别:
def even: Int => Boolean = _ % 2 == 0
and
val even: Int => Boolean = _ % 2 == 0
两者都可以称为偶数(10)。
当前回答
注意:Scala中有不同类型的函数:抽象的、具体的、匿名的、高阶的、纯的、不纯的等等。
val函数的解释:
Scala中的val函数是一个完整的对象。Scala中有一些特征来表示具有不同数量参数的函数:Function0、Function1、Function2等等。作为实现这些特征之一的类的实例,函数对象具有方法。其中一个方法是apply方法,它包含实现函数体的代码。
当我们创建一个值为函数对象的变量,然后在引用该变量后加上括号时,这将转换为对函数对象的apply方法的调用。
解释方法,即def:
Scala中的方法不是值,但函数是。
Scala方法,就像在Java中一样,是类的一部分。它有一个名称、一个签名、可选的一些注释和一些字节码。
方法的实现是一个有序的语句序列,生成的值必须与其返回类型兼容。
其他回答
此外,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值替换它,这样表达式就不需要再次求值。