`
过河卒
  • 浏览: 78092 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

我眼中的“闭包”

阅读更多

我眼中的“闭包”

  • 接触闭包
    •        接触编程以来,接触过好几种编程语言中都提到了闭包这个语言特性,Javascript,Ruby,Perl。最近在看关于Groovy的 时候也突出谈了闭包这个特性。Search了一下各大搜索引擎,发现Java里面也开始讨论要不要在后续版本里面加入闭包的特性了。由此可见闭包这个特 性,如何的吸引人。闲话少说,直接来看闭包吧!
              下面的主要内容来源于各个搜索引擎。我只是整理了一下,找出一个最便于我自己理解的版本表述如下,可能在你看来这些理解是有失偏颇的,请你不要吝惜的告诉我。参考资料列表会附在后面,有兴趣可以直接读那些资料。

  • 什么是闭包
    • 闭包的概念,不同资料给出了好几种。
    • 闭包:包含了自由(未绑定)变量的代码块,这些变量不是在这个代码块中或者任何全局上下文中定义的,而是定义代码块的环境中定义的。也就是下面两部分:
      • 要执行的代码块(由于自由变量存在,相关变量引用没有释放)
      • 为自由变量提供绑定的计算环境(作用域)
    • 闭包:一种函数对象或者匿名函数,作为参数传递,可以动态的创建与返回
    • 闭包:具有闭合作用域的匿名函数
      • 第一层理解:闭包是具有特别作用域规则且可以作为参数的代码块
        • 代码说明:
          3.times {puts "Inside the times method."}

          Results:
          Inside the times method.
          Inside the times method.
          Inside the times method.

      • 第二层理解:给上述的代码块扩展一个参数列表,使方法或函数可以与这个代码通讯
        • 代码说明:
          ['lions', 'tigers', 'bears'].each {|item| puts item}

          Results:
          lions
          tigers
          bears
      • 第三层理解:将这样的代码块作为参数传递
        • 代码说明:
          animals = ['lions', 'tigers', 'bears'].collect {|item| item.upcase}
          puts animals.join(" and ") + " oh, my."

          LIONS and TIGERS and BEARS oh, my.

      • 第四层理解:定义代码块的环境的名称空间和使用它的函数之间的作用域本质上是一个作用域,即:作用域是闭合的
        • 代码说明:
          tax = 0.08
          prices = [4.45, 6.34, 3.78]
          tax_table = prices.collect {|price| {:price => price, :tax => price * tax}}
          tax_table.collect {|item| puts "Price: #{item[:price]}    Tax: #{item[:tax]}"}

          Results:
          Price: 4.45    Tax: 0.356
          Price: 6.34    Tax: 0.5072
          Price: 3.78    Tax: 0.3024

    • 按照SCIP定义:闭包就是一个携带有本地状态的函数
  • 我对闭包的理解
    • 闭包具有函数的性质
      • 能完成一定的功能的代码块
      • 能够预定义参数和引用作用域中的参数
      • 能够在需要的地方被调用
    • 闭包可以看成对象
      • 能够作为参数传递
    • 作用域的作用
      • 作用域设定一个运行空间,但是作用域本身也很无赖,作用域知道自己能干什么,但是不知道具体要怎么做。只要作用域真正要用的时候,见到了闭包里面的代码块,作用域才算功德圆满了。这就是所谓“动态”的一种体现吧
      • 作用域决定了闭包中代码块的使用方法
      • 作用域决定了闭包中预设参数的本质,如参数的个数,类型
        • 疑问:还没有搞清楚一个问题,在这里请教一下知道的  
          在闭包里面作用域提供的参数 是怎么和闭包里面预设的参数一一对应起来的呢?见下面代码
          printMapClosure = {| key, value| puts key + "=" + value }
          [ "yue" : "wu", "lane" : "burks", "sudha" : "saseethiaseeleethialeselan" ].each(printMapClosure)
          result:yue=wu
          lane=burks
          sudha=saseethiaseeleethialeselan
          我想知道为什么 key就对应yue,lane,sudha呢?而value就会对应wu,burks,sasee...呢?
          不要告诉我是语义匹配这么高深的回答。呵呵  希望知道的人能给我说明白了怎么回事啊?指给我一些资料我也感激不尽啊。

      • 作用域决定了闭包的最终处理结果
    • 总结:闭包是一种被作用域限制的函数对象
  • 另附:未来Java可能会采用的两种闭包形式
    • BGGA方案
      • 说明:扩展了类型系统,引入了 function 类型,即函数都带有一个类型参数列表、返回类型和 throws 子句。

        代码:完成求平方和
        sumOfSquares = mapReduce(myBigCollection,
        { Double x => x * x },
        { Double x, Double y => x + y });

    • CICE方案
      • 说明:通过定义更简化的内部类来完成对闭包的支持

        代码:完成求平方和
        Double sumOfSquares = mapReduce(myBigCollection,
        UnaryFunction<Double>(Double x) { return x*x; },
        BinaryFunction<Double, Double>(Double x, Double y) { return x+y; });

  • 附,参考资料
    • Java语言与实践:闭包之争 http://www.ibm.com/developerworks/cn/java/j-jtp04247.html

      跨越边界:闭包 http://www.ibm.com/developerworks/cn/java/j-cb01097.html

      MartinFowler说闭包
      http://blog.csdn.net/limux/archive/2005/07/05/413911.aspx (中文)
      http://martinfowler.com/bliki/Closure.html(英文)



彭俊 2007-09-19 17:45 发表评论
分享到:
评论

相关推荐

    C语言实现三种闭包算法(传递,自反,对称闭包)

    在计算机科学中,闭包是一种重要的概念,尤其在函数式编程和逻辑编程中。闭包在C语言中可能不如在一些动态类型的语言中那么常见,但依然可以通过巧妙的技巧实现。这里我们将详细讨论如何用C语言实现传递闭包、自反...

    离散数学-关系,集合,求自反闭包,对称闭包,传递闭包

    离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包...

    Java闭包 Java闭包

    在2013年发布的 JavaSE8 中包含一个叫做 ...闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试着放一些样例程序来解释一些概念和语法。

    关系闭包的计算

    ### 关系闭包的计算 #### 实验背景与目的 在计算机科学与数学领域中,关系闭包是一种重要的概念,特别是在图论与数据库理论中有着广泛的应用。本实验旨在通过编程实践的方式帮助学习者深入理解关系闭包的概念,并...

    计算NFA中ε闭包

    ### 计算NFA中的ε闭包 #### 一、NFA与ε闭包概念介绍 **非确定有限自动机(NFA)**是一种理论计算模型,它扩展了确定有限自动机(DFA)的概念,允许在某些情况下从一个状态出发到达多个状态。在NFA中,存在一种特殊的...

    求闭包 属性集闭包 函数依赖的闭包

    3. 用户输入完毕所有的依赖后,显示“请输入属性集求闭包”的提示,当用户输入1个或者多个属性时,求出对应的闭包。(如,用户输入A,则显示A+的值, 用户输入AB则求出AB+的值。显示完毕后,再次显示“请输入属性集...

    数据库求属性集闭包&函数依赖闭包

    3) 计算属性集闭包的算法,在课件里有详细说明。方法很简单,但用文字描述很抽象。。。。不解释。。。 4) 计算函数依赖的闭包。此步骤不作要求,但要会方法。个人总结:将所有属性元素组成一个集合(域)记为R;...

    Swift之闭包ClosureDemo

    Swift中的闭包是一种强大的编程概念,它允许我们定义一段可移动和可重用的代码块,可以在函数中作为参数传递,也可以作为返回值。闭包在很多编程语言中都有类似的概念,但在Swift中,它们的设计既简洁又灵活,使得...

    最符合菜鸟的闭包

    闭包是编程语言中的一个重要概念,特别是在JavaScript等函数式编程语言中。对于初学者来说,它可能显得有些抽象,但理解闭包对于提升编程技能至关重要。闭包是一种特殊的作用域,它允许函数访问并操作其外部作用域的...

    用矩阵求自反闭包自反闭包

    在计算机科学和图论中,自反闭包是与关系理论相关的概念,特别是在布尔代数和图的子结构分析中。自反闭包是指给定一个关系R,将其扩展为包含所有起点到自身的元素对,即对于每一个元素a,都有(a, a)属于自反闭包。这...

    内存泄露,闭包 内存泄露,闭包 内存泄露,闭包

    内存泄露和闭包是两个关键概念,它们紧密关联并可能对程序性能产生重大影响。 内存泄露是指程序在不再需要某些数据时,未能释放这些数据所占用的内存。在JavaScript中,由于其自动垃圾回收(Garbage Collection, GC...

    原子闭包系统, 原子闭包算子和原子全蕴含系统

    原子闭包系统、原子闭包算子以及原子全蕴含系统是数理逻辑、抽象代数以及数学基础理论中的概念。在本篇文章中,作者杨海建、李庆国和何霞辉对这些概念进行了深入探讨,同时也研究了它们之间的相互关系,并且提出了...

    Javascript 闭包完整解释

    ### JavaScript闭包完整解释 #### 一、闭包的基本概念 **闭包**是一个非常重要的JavaScript概念,它指的是一个函数能够记住并访问其外部作用域中的变量的能力,即使该函数在其外部作用域之外被调用也是如此。具体...

    js闭包详细讲解

    ### JavaScript闭包详解 #### 一、闭包概念与特性 **闭包**是JavaScript语言的一个重要特性,它使得函数可以访问并操作其外部作用域内的变量,即使该函数在其外部作用域之外被调用。要理解闭包,首先需要了解...

    ios-闭包传值.zip

    在iOS开发中,闭包(Closure)是一种强大的编程工具,它允许我们定义代码块并可以在程序的不同地方作为值传递。闭包可以捕获和存储它所在上下文中的常量和变量,这使得它们非常适合用于异步操作、回调函数或者封装一...

    二元关系的闭包运算

    常见的闭包有传递闭包、自反闭包和对称闭包。 1. **传递闭包**:如果关系R满足这样的性质:对于所有a, b, c属于A,若aRb且bRc,则aRc,我们就说R是传递的。传递闭包是包含R及其所有可能通过传递性推导出的元素对的...

    JS闭包可被利用的常见场景

    JavaScript 闭包是一种强大的编程工具,常常被用来解决特定的问题和优化代码结构。在JavaScript中,闭包是指一个函数能够访问并操作其定义时的作用域内的变量,即使该函数在其外部作用域被调用。以下将详细介绍两个...

    对于三元闭包的验证.zip

    在IT领域,三元闭包是一个重要的概念,特别是在社交网络分析和图论中。这个理论主要探讨了在社交网络中的关系连接模式,特别是在理解和描述个体之间的互动和连通性时起到关键作用。在这个场景中,"对于三元闭包的...

    js闭包个人理解

    ### JavaScript闭包的理解 在JavaScript中,闭包(Closure)是一种非常重要的概念,它涉及到函数作用域、变量生命周期以及函数内部对外部作用域的访问等多个方面。本文将基于提供的文件内容,深入探讨JavaScript...

    Swift 中的闭包和 Objective-C 中的Block

    Swift中的闭包和Objective-C中的Block是两种编程语言中实现匿名函数的关键特性,它们允许我们定义可以在不同上下文中使用的代码块。尽管这两种语言都属于Apple的生态系统,但它们在闭包和Block的概念上有细微差别。 ...

Global site tag (gtag.js) - Google Analytics