我的回复:
scala> val valRandom2 = (_:Int) + Random.nextInt
valRandom2: Int => Int = <function1>
所以 valRandom2 是一个东西,它接受一个 Int 并返回一个 Int,并且是 function1 类型。例如:
scala> val valRandom3 = (_:Int) + (_:Int) + Random.nextInt
valRandom3: (Int, Int) => Int = <function2>
这是 function2 类型。
数字 (1, 2) 表示传入了多少个参数。函数总是返回一个值,所以这无关紧要。即使没有返回,因为它是一个过程,可能是为了副作用而调用的,它隐式返回 Unit()。如果它返回某物或元组的列表,那只是一件事,您必须将其分解,才能获得多个值之一。
函数与方法不同。函数可以传递,延迟执行,方法可以直接调用,但是方法很容易作为函数传递。
scala> def add (a: Int, b:Int) : Int = a + b
add: (a: Int, b: Int)Int
scala> def mul (a: Int, b:Int) : Int = a * b
mul: (a: Int, b: Int)Int
scala> def printIt (a: Int, b:Int, f:(Int, Int) => Int) = {
| val c = f (b, a)
| println (s"b $b (X) a $a = c $c")
| }
printIt: (a: Int, b: Int, f: (Int, Int) => Int)Unit
scala> printIt (3, 4, add)
b 4 (X) a 3 = c 7
scala> printIt (3, 4, mul)
b 4 (X) a 3 = c 12
这个例子虽然很容易理解,但并没有解释它为什么有用,但有用的例子设置起来更复杂。但是想象一个可以对数值进行排序的列表。如果您有一个员工列表,您可以通过将函数传递给列表来对它们进行排序,以从员工中获取数字,无论是 Employee.id、*.age、*.maxSalary ()、.address.zipCode 还是无论如何,这会给你最大的灵活性。
到评论:
scala> val valRandom2 = {println ("vR2 called"); (_:Int) + Random.nextInt}
vR2 called
valRandom2: Int => Int = <function1>
scala> val x = valRandom2 (0)
x: Int = -1231081
scala> val x = valRandom2 (0)
x: Int = 1421497830
为什么在声明时打印,而在使用时执行nextInt?
因为
scala> val valRandom2 = {println ("vR2 called"); (_:Int) + Random.nextInt}
vR2 called
valRandom2: Int => Int = <function1>
scala> val valRandom2 = {println ("vR2 called"); (_:Int) + Random.nextInt}
vR2 called
valRandom2: Int => Int = <function1>
scala> val x = valRandom2
x: Int => Int = <function1>
rhs 的结果是函数,它被分配给 valRandom2 或 x,而 print 是声明的副作用。该块作为其最后一个表达式返回函数。
交换 valRandom2 上的内部调用,你什么也得不到(单位)。
将参数 Int 添加到第二次调用中:
scala> val valRandom3 = {Random.nextInt; (_:Int) => println ("vR2 called") }
valRandom3: Int => Unit = <function1>
scala> valRandom3 (0)
vR2 called
scala> valRandom3 (0)
vR2 called