这三种在Scala中定义函数的方式之间的区别
给定expression相同函数f(a) := a + 1
三种方法f(a) := a + 1
:
val f1 = (a:Int) => a + 1 def f2 = (a:Int) => a + 1 def f3:(Int => Int) = a => a + 1
这些定义如何不同? REPL没有表明任何明显的差异:
scala> f1 res38: (Int) => Int = <function1> scala> f2 res39: (Int) => Int = <function1> scala> f3 res40: (Int) => Int = <function1>
f1
是一个取整数并返回整数的函数。
f2
是一个零元素的方法,返回一个整数并返回一个整数的函数。 (稍后在REPL中键入f2
时,将成为方法f2
的调用。)
f3
和f2
。 你只是没有在那里使用types推断。
在类内部, val
在初始化时被评估,而def
仅在每次调用函数时被评估。 在下面的代码中,您将看到x在第一次使用该对象时被评估,但是在x成员被访问时不会再次被评估。 相反,当对象被实例化时,y不被评估,而是在每次访问成员时被评估。
class A(a: Int) { val x = { println("x is set to something"); a } def y = { println("y is set to something"); a } } // Prints: x is set to something val a = new A(1) // Prints: "1" println(ax) // Prints: "1" println(ax) // Prints: "y is set to something" and "1" println(ay) // Prints: "y is set to something" and "1" println(ay)
执行定义如def x = e不会评估expression式e 。 相反,只要使用x,就会评估e 。 或者,Scala提供了一个值定义val x = e,它将右边的e作为评估定义的一部分。 如果随后使用x ,则立即用预先计算的e值replace,以便不需要再次评估expression式。
斯卡拉由马丁Odersky的例子