scala-函数字面量、闭包、3种函数参数形式

  1. 函数字面量:就是一个函数作为表达式使用,有匿名函数的意思
    def m = (x: Int) => x + 1
    println(m(1))
  2. 闭包:简单说就是函数字面量+自由变量;在运行时,捕获自由变量,从这个函数字面量创建出函数对象(函数值),叫做闭包
    // 例子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)
    1. 相应的函数值结果,就叫做闭包,因为函数值是通过闭合这个动作产生的,比如inc1和inc99就是闭包
    2. 闭包这个词,源于:“捕获”自由变量从而闭合函数字面量的动作
    3. 闭包:捕获的是自由变量本身,而不是自由变量引用的值
  3. 函数调用参数三种形式
    1. 重复参数,用*
      def echo(args:String*)={
      	for(arg <- args) println(arg)
      }

       

    2. 带名字的参数,顺序可以任意

      def echo(arg:String, time:String)={
      	println(arg)
      }
      echo(time="10", arg="arg")
      // 结果
      // arg

       

    3. 缺省值,默认值:zero如果没传入,自动赋值为0
      def echo(arg:String, time:String, zero:Int = 0)={
      	println(arg)
      }

       

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值