有什么区别:
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)。
当前回答
瓦尔。“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)
}
We know, in Scala last statement of above kind of expression (inside { .. }) is actually return to the left hand side. So you end up setting even2 to "x => x % 2 == 0" function, which matches with the type you declared for even2 val type i.e. (Int => Boolean), so compiler is happy. Now even2 only points to "(x => x % 2 == 0)" function (not any other statement before i.e. println("val") etc. Invoking event2 with different parameters will actually invoke "(x => x % 2 == 0)" code, as only that is saved with 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>
其他回答
执行像def x = e这样的定义不会求表达式e的值。相反,每当x被调用时,e都会被求值。
或者,Scala提供了一个值定义 Val x = e,它计算右边的值作为定义值的一部分。 如果随后使用x,则立即用预先计算的e值替换它,这样表达式就不需要再次求值。
除了上述有用的回复,我的发现是:
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
瓦尔。“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)
}
We know, in Scala last statement of above kind of expression (inside { .. }) is actually return to the left hand side. So you end up setting even2 to "x => x % 2 == 0" function, which matches with the type you declared for even2 val type i.e. (Int => Boolean), so compiler is happy. Now even2 only points to "(x => x % 2 == 0)" function (not any other statement before i.e. println("val") etc. Invoking event2 with different parameters will actually invoke "(x => x % 2 == 0)" code, as only that is saved with 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>
此外,Val是一个按值求值。这意味着右边的表达式在定义期间被求值。其中Def是通过名称求值。直到它被使用时才会计算。
注意:Scala中有不同类型的函数:抽象的、具体的、匿名的、高阶的、纯的、不纯的等等。
val函数的解释:
Scala中的val函数是一个完整的对象。Scala中有一些特征来表示具有不同数量参数的函数:Function0、Function1、Function2等等。作为实现这些特征之一的类的实例,函数对象具有方法。其中一个方法是apply方法,它包含实现函数体的代码。
当我们创建一个值为函数对象的变量,然后在引用该变量后加上括号时,这将转换为对函数对象的apply方法的调用。
解释方法,即def:
Scala中的方法不是值,但函数是。
Scala方法,就像在Java中一样,是类的一部分。它有一个名称、一个签名、可选的一些注释和一些字节码。
方法的实现是一个有序的语句序列,生成的值必须与其返回类型兼容。