zoukankan      html  css  js  c++  java
  • Scala学习笔记(七):闭包

    不带自由变量的函数字面量被称为封闭项,依照函数字面量在运行时创建的对象被称为闭包

    自由变量

    (x:Int) => x + more

    上述代码引入一个自由变量 more,它定义在函数外面

    完整示例:

    scala> var more =1
    more: Int = 1
    scala> val addMore = (x:Int) => x + more
    addMore: Int => Int = <function1>
    scala> addMore (100)
    res1: Int = 101

    此处函数变量 addMore 称为一个“闭包”:因为它引用函数外面定义的变量,定义这个函数的过程是将这个自由变量捕获而构成一个封闭的函数。

    当自由变量发生变化时,Scala 的闭包能够捕获到这个变化,因为 Scala 的闭包捕获的是变量本身而不是当时变量的值。

    scala> more =  9999
    more: Int = 9999
    scala> addMore ( 10)
    res2: Int = 10009

    同样,如果变量在闭包发生变化,也会反映到函数外面定义的变量

    scala> val numbers = List ( -11, -10, -5, 0, 5, 10)
    numbers: List[Int] = List(-11, -10, -5, 0, 5, 10)
    scala> var sum =0
    sum: Int = 0
    scala> numbers.foreach(sum += _)
    scala> sum
    res4: Int = -11

    一个闭包如果使用了一个函数的参数,然后该函数被多次调用,那么闭包所引用的变量为定义该闭包时变量的值

    scala> def makeIncreaser(more: Int) = (x: Int) => x + more
    makeIncreaser: (more: Int)Int => Int
    scala> val inc1=makeIncreaser(1)
    inc1: Int => Int = <function1>
    scala> val inc9999=makeIncreaser(9999)
    inc9999: Int => Int = <function1>
    scala> inc1(10)
    res5: Int = 11
    scala> inc9999(10)
    res6: Int = 10009

    定义闭包时相当于保存了当时程序状态的一个快照

    调用 makeIncreaser(1) 时所创建闭包引用的 more 的值为 1,而调用 makeIncreaser(9999) 时所创建闭包引用的 more 的值为 9999。

     
  • 相关阅读:
    FLEX图像工具类-图像变形
    flex中list或Combox中的子项上移下移操作
    flex中socket的使用
    Flex2款简单FLV播放器很经典
    Flex中Css参考示例
    Flex中CursorManager的应用
    关于FLEX的安全沙箱问题
    Flex实现多文件上传之一:前台部分
    Flex与JS通信
    metasploit 常用指令
  • 原文地址:https://www.cnblogs.com/studyLog-share/p/4788424.html
Copyright © 2011-2022 走看看