scala函数的参数:求值策略
1、call by value:对函数的实参求值,并只求值一次
举例:def test1(x:Int, y:Int):Int = x+x 没有用到y
2、call by name:函数的实参每次在函数体内部被调用的时候,都会进行求值
举例:def test2(x: => Int, y: => Int):Int = x + x 没有用到y
3:、一个复杂的例子
x是call by value
y是call by name
def test3(x:Int, y: => Int):Int = 1
在定义一个函数
def loop():Int = loop
分别进行调用
scala> test3(1, loop) -->正常
res31: Int = 1
scala> test3(loop, 1) -> 死循环
4.自己的理解:
call by value:不管怎样都会求实参,并且只求一次
call by name:只有用的时候才求实参
方法作为参数传递时自动做隐形转换
#可以将函数作为方法的参数进行传递,也可以将方法作为方法的参数传递,但是程序本身会做隐形转换
scala> val arr = Array(1,2,3,5,8)
scala> val f = (x: Int) => x*x
f: Int => Int = <function1>
scala> def m(x:Int) = x*x
m: (x: Int)Int
scala> arr.map(f)
res15: Array[Int] = Array(1, 4, 9, 25, 64)
scala> arr.map(m)
res16: Array[Int] = Array(1, 4, 9, 25, 64)
#显式将方法转换为函数
scala> m _
res19: Int => Int = <function1>