闭包(计算机科学)是什么?

2022-12-16 程序员资讯 0 374
¥ 2.88B

包年VIP免费升级包年VIP

开通VIP尊享优惠特权
立即下载 升级会员

闭包(计算机科学)是什么?

这那哥,懂的人,大自然懂

上面已经开始自问自答

———————————————-

1. 女团子(Combinator)

一般他们常说的三个“表达式”:

f(x,y)=x+yf(x,y)=x+y

表达式有三个“自表达式”(名词:束缚表达式),x和y。表达式的codice,也是应表达式,是自表达式一连串操作方式的结论。比如说范例里是回到x和y的和。这种的三个它外部操作方式倚赖的表达式全数由模块提供了的”自给“的表达式,叫“女团子(Combinator)”。

闭包(计算机科学)是什么?

Java标识符则表示是:

public int add(int x, int y){ return x+y; }

换到编程的概念,强调的是表达式的**“作用域”**。大多数编程语言都是用一对花括号**”{}”**标识出作用域。上面标识符里的add()表达式被调用之后,

int sum=add(2,3);

编译器编译之后,可以理解成是这个样子,表达式的模块x和y,是包含在表达式add()的作用域里的。

add(){ int x=2; int y=3; return x+y; }

或者,表达式像上面这种写也可以。这时候x作为表达式模块出现,而y作为表达式局部表达式出现。效果和上面的范例是一样的。

public int add(int x){ int y=3; return x+y; }

2. 自由表达式

但有的时候,表达式也可以有它自身作用域以外的模块参与。这些在表达式作用域以外,由表达式的外部环境提供更多的模块就叫“自由表达式(Free Variable)”。比如说上面这个xx 的表达式,回到xxyy 的和。这里的yy是自由表达式。

f(x)=x+yf(x)=x+y

写成标识符就是这种,

int y=3; add(){ int x=2; return x+y; }
闭包(计算机科学)是什么?

3. 旋量群(Closure)

大白话不怎么严谨的说法是三点:

三个倚赖于自由表达式的表达式

处在含有这些自由表达式的三个外围环境

这个表达式能够访问外围环境里的自由表达式

看上面这个Javascript旋量群的范例:

function Add(y) { return function(x) { return x + y } }

对外部表达式function(x)来讲,y是自由表达式,而且function(x)的codice,倚赖于这个外部自由表达式y。而往上推一层,外围Add(y)表达式正好是那个包含自由表达式y的环境。而且Javascript的语法允许外部表达式function(x)访问外部表达式Add(y)的局部表达式。满足这三个条件,所以这个时候,外部表达式Add(y)对外部表达式function(x)构成了旋量群。

旋量群的结构,如果用λ演算表达式来写,是多模块的Currying技术。

> λx.λy.x+y

但在Java中他们看不到这种的结构。因为Java主流语法不允许这种的直接的表达式套嵌和跨域访问表达式。

4. 类和对象

但Java中真的不存在旋量群吗?正好相反,Java到处都是旋量群,所以反而他们感觉不出来在使用旋量群。因为Java的“对象”其实是三个旋量群。其实无论是旋量群也好,对象也好,都是一种数据封装的手段。看上面这个类,

class Add{ private int x=2; public int add(){ int y=3; return x+y; } }

看上去x在表达式add()的作用域外面,但是通过Add类实例化的过程,变量”x“和数值”2“之间已经绑定了,而且和表达式add()也已经打包在一起。add()表达式其实是透过this关键字来访问对象的成员字段的。

5. 外部类是旋量群:包含指向外部类的指针

Java中的外部类是一个典型的旋量群结构。标识符如下

public class Outer { private class Inner{ private x=100; public int innerAdd(){ return x+y; } } private int y=100; }

下图画的是上面标识符的结构。外部类(Inner Class)通过包含三个指向外部类的引用,做到自由访问外部环境类的所有字段,变相把环境中的自由表达式封装到表达式里,形成三个旋量群。

闭包(计算机科学)是什么?

6. 后续

关于Java旋量群更详细的解释,参见另三个回答。

java为甚么匿名外部类的模块引用时final? – 胖胖的回答

——————————————————-

我的笔记栈 http://ciaoshen.com (笔记向,非教程)

资源下载此资源下载价格为2.88B,包年VIP免费,请先
2405474279

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务