求值策略
(1)Call By Value:对函数实参求值且仅求一次
(2)Call By Name:函数实参每次在函数体内被用到时都会求值,参数第一次被用到时才求值。
Scala通常使用Call By Value,若函数形参类型以=>开头,那么会使用Call By Name。
def foo(x:Int) = x //Call By Value
def foo(x:=>Int) = x //Call By Name
例:
① def test1(x:Int,y:Int):Int = x*x ② def test2(x:=>Int,y:=>Int):Int = x*x
value:test1(3+4,8) name:test2(3+4,8)
test1(7,8) (3+4)*(3+4)
7*7 7*(3+4)
少一步 7*7
test1(7,2*4) test2(7,2*4)
test1(7,8) 7*7
7*7 少一步
def bar(x:Int ,y:=>Int):Int = 1
def loop():Int = loop
bar (1,loop) res0:Int = 1
bar(loop,1) 死循环
高阶函数
函数是一等公民,Scala支持:
1,把函数作为实参传递给另外一个函数
2,把函数作为返回值
3,把函数赋值给变量
4,把函数存储在数据结构里
高阶函数:
1,参数是函数
2,返回值是函数
匿名函数:本质是函数常量
(形参列表)=>{函数体}
柯里化:
把具有多个参数的函数,转换为一条函数链,每个节点上是单一参数。
递归函数:
尾递归解决堆栈溢出,所有递归形式的调用,都出现在函数的末尾