注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

闭包的理解  

2015-04-01 17:01:42|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

闭包的理解

无论最近从C#还是JAVA上,到最新的C++11都不约而同的提到了“闭包”这个概念。什么是闭包,接触这个概念还是从离散数学上接触到的。

闭包按离散数学上理解,应该就是“关系的闭包运算时关系上的一元运算,它把给出的关系R扩充成一新关系R’,使R’具有一定的性质,且所进行的扩充又是最小的。”更详细和准确的大家可以看一下书本。

其实认真看过这几种语言使用的闭包这个概念和例程后发现,其实和数学上的闭包是一致的。基本对闭包的说明就两种:1、是一个函数;2、是一个代码块,其由函数和相关引用的环境组合成的。

说得挺绕口,其实举个例子就明白了:

C++

  std::for_each(vecTest.begin(), vecTest.end(),

        [&m](int& x)

        {

            x = m++;

        }

);

JAVA

public class FirstLambdaExpression { 

    public String variable = "Class Level Variable"; 

    public static void main(String[] arg) { 

        new FirstLambdaExpression().lambdaExpression(); 

    } 

    public void lambdaExpression(){ 

        String variable = "Method Local Variable"; 

        String nonFinalVariable = "This is non final variable"; 

        new Thread (() -> { 

            //Below line gives compilation error 

            //String variable = "Run Method Variable" 

            System.out.println("->" + variable); 

            System.out.println("->" + this.variable); 

       }).start(); 

    } 

}

C#的就不举了,太多了。在C++的例子中,首先Lambada表达式就是一个函数,就是一个闭包。但是请注意,函数中是引用了m这个变量的,所以说,是需要一定的环境的,m从哪里来?如果仅仅是这个函数,还是表述不太清楚的。

JAVA中使用闭包还有一个原因,在JDK8以前,是不支持Lamabda表达式的,大量的匿名的内部类搞定了相关的操作。但是匿名的内部类是有不足的:

1、  它使代码看起来非常的复杂,不容易维护和理解。Vertical Problem

2、  它不能访问外面的非final变量。

3、  This这个关键字容易使人迷惑,比如内部类有一个变量叫a,外部也有一个final  a,使用this时,你就得小心。

从上面来看,所有的术语,在计算机的体系里基本还是没有太大的变化的。

 

  评论这张
 
阅读(317)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017