- 函数字面量:就是一个函数作为表达式使用,有匿名函数的意思
def m = (x: Int) => x + 1 println(m(1))
- 闭包:简单说就是函数字面量+自由变量;在运行时,捕获自由变量,从这个函数字面量创建出函数对象(函数值),叫做闭包
// 例子1 // 这个函数是创建并返回闭包的函数:每调用一次,就会产生一个闭包 // 这里的more是局部变量,作用域是makeInt函数内部 def makeInt(more: Int) = (x: Int) => x + more // 产生闭包:捕获了more变量本身 val inc1 = makeInt(1) println(inc1(10)) // 例子2:闭包能看到闭包外对自由变量的修改 // 这里的more,是全局变量 var more = 1 // makeInt是闭包 def makeInt = (x:Int) => x + more println(makeInt(2)) // 3 more = 4 println(makeInt(2)) // 6 // 例子3:闭包的结果会被闭包外部看到 var more = 1; val testList = List(2,3,4) // foreach函数里面引用了自由变量more,也形成了闭包 testList.foreach(more += _) println(more)
- 相应的函数值结果,就叫做闭包,因为函数值是通过闭合这个动作产生的,比如inc1和inc99就是闭包
- 闭包这个词,源于:“捕获”自由变量从而闭合函数字面量的动作
- 闭包:捕获的是自由变量本身,而不是自由变量引用的值
- 函数调用参数三种形式
- 重复参数,用*
def echo(args:String*)={ for(arg <- args) println(arg) }
-
带名字的参数,顺序可以任意
def echo(arg:String, time:String)={ println(arg) } echo(time="10", arg="arg") // 结果 // arg
- 缺省值,默认值:zero如果没传入,自动赋值为0
def echo(arg:String, time:String, zero:Int = 0)={ println(arg) }
- 重复参数,用*