啥是闭包

啥是闭包

我最近经常看到闭包这个概念,我发现离散数学里面有闭包,数据库里面也有闭包,写程序的时候还有闭包函数,所以闭包到底是个啥呢?

离散数学中的闭包:

首先看定义:

一个关系R的闭包,是指加上最小数目的有序偶而形成的具有自反性,对称性或传递性的新的有序偶集,此集就是关系R的闭包。

闭包的定义是,包含指定集合的满足在某个运算下闭合的最小集合。

离散数学中,闭包是一个集合,什么的集合呢?

集合里面的元素是什么呢?

要讲清楚这个问题,要引入闭合的概念。

闭合指的是在一个集合上执行某种运算,得到的结果还是这个集合的元素,那么就说该集合在这个运算操作下构成闭合。

既然有闭合那就肯定有不闭合,

如果我想让他闭合怎么办呢?

我给这个集合添加若干元素,让他满足闭合的特性。

添加元素也不能乱添,我们要找出添加元素数量最少的一种情况。

这种情况下,由新加入的元素后的集合,被在这种运算下的闭包

定义是: 包含指定集合的满足在某个运算下闭合的最小集合

编程语言中的闭包

编程的时候会遇到闭包函数:

即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。

说白了就是在和函数体内部定义函数

比如在python里面可以这样定义:

def fun(n):
	a = 1
	def helper(x):
		x += a
		return x
	
	b = helper(n)
	print(b)

数据库中闭包

数据库中闭包概念:

设X是函数依赖集,被X逻辑蕴涵的函数依赖全体构成的集合,称为函数依赖集X的闭包,记为X+。

我个人理解数据库设计过程中使用的闭包概念和离散数学中的有很大关联

两者都是建立在关系、集合的基础上的

但是数据库的内容太多了,我准备整理一下另写一篇。

他们之间的联系

编程中的闭包和离散数学中的闭包理论上好像没什么俩系,没有直接证据证明他们的关系。计算机语言中闭包的用法是发明者只是用了相同的词汇而已。

参考链接

知乎:离散数学中的闭包和计算机语言中的闭包有联系吗?

百度百科:闭包函数

### 闭包的概念 闭包是指一个能够记住并访问其外部作用域中变量的函数,即使这个函数在其定义的作用域之外被调用[^1]。换句话说,闭包是由函数及其相关的引用环境组合而成的一个整体实体。这种机制使得函数可以在其生命周期结束后仍然保持对外部变量的访问。 #### 定义 在编程语言中,闭包通常由以下几个要素组成: - **嵌套函数**:内部函数可以访问外部函数的局部变量。 - **自由变量**:这些是在函数体外定义但在函数体内使用的变量。 - **持久化状态**:当外部函数返回后,内部函数仍保留对其外部变量的引用,从而实现一种持久化的状态管理。 例如,在 JavaScript 中,如果一个函数返回另一个函数,则后者会形成一个闭包来捕获前者的作用域链[^4]: ```javascript function outerFunction(externalValue) { let localVariable = externalValue; function innerFunction(valueToAdd) { return localVariable + valueToAdd; // 访问外部变量 } return innerFunction; } const closureInstance = outerFunction(10); console.log(closureInstance(5)); // 输出 15 ``` 在这个例子中,`innerFunction` 是 `outerFunction` 返回的结果,并且它保存了一个指向 `localVariable` 的引用。尽管 `outerFunction` 已经完成执行,但是通过闭包,`innerFunction` 能够继续使用该变量。 ### 使用方法 不同编程语言对于闭包的支持方式有所不同,但核心思想一致——允许函数携带自己的运行上下文以便于跨范围操作共享数据。以下是几种常见语言如何处理闭包的例子: #### Ruby中的闭包应用 Ruby 提供了多种创建闭包的方式,比如 Proc 和 Lambda。下面展示的是利用 block 实现简单的累加器功能[^2]: ```ruby def create_counter(initial_value=0) lambda { |increment| initial_value += increment } # 创建匿名函数作为闭包 end counter = create_counter() puts counter.call(3) # 输出 3 (初始值加上增量) puts counter.call(-1) # 输出 2 (上次计算结果再减去1) ``` 这里展示了如何借助闭包维持计数器的状态变化过程而不需显式传递额外参数。 #### Swift里的闭包语法特点 Swift 对闭包有着非常灵活的表现形式,既可以采用完整的函数声明也可以简化成简洁版表达式[^3] : ```swift // 标准写法 let sortComparator: (String, String) -> Bool = { s1, s2 in return s1 < s2 } print(["b", "a"].sorted(by: sortComparator)) // 简洁版本 let shortSorter: (Int, Int) -> Bool = {$0 > $1} print([3,7].sorted(by:shortSorter)) ``` 以上两个片段分别演示了标准书写风格与紧凑型之间的差异对比情况。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值