文章图片
文章图片
闭包是函数式编程及其核心思想“Lambda 计算法”(Lambda Calculus)的必备基本设定 , 我们都知道:
函数式编程有一个特点 , 就是所有操作都用可计算的函数(computable function , 下简称“函数”)来体现 。 函数的两个特点 , 就是每个函数都有一个输入值 , 一个输出值 。
函数还有一个定律 , 就是给定一个确定的输入值 , 总能得到一个确定的输出值 , 即输入与输出有严格的一一对应关系 。 (当然还有副作用之类的 , 此处不论 。 )
第一是抽象 。 既然所有“多参数函数”都可以抽象成一个高级的“单参数函数”(用上面的方法) , 那么意味着“多参数函数”本身是有信息冗余的 。 这个抽象的过程就像是拆掉分子分母的公约数一样 , 去掉了这个冗余 。
第二是计算 。 我们想象一下任何一种“计算机器” , 它要做一个最简单的加法 , 那么它需要:
- 读取 a , 保存
- 读取 b , 计算 a + b
- 返回结果 。
如果把这个保存了某个状态的机器视作是一个新的机器(在内存里写死了 a 值 , 等待 b 值做加法) , 那么新的机器才是真正在做“计算” 。 原来什么值都没有保存的机器有没有在做计算呢?我们不妨认为它也在做“计算” , 这个计算的参数则是 a 值 , 计算结果就是前面说的新机器 。
在解决异步编程的内存管理问题上十分有意义 。 只要我们目前使用的计算机硬件架构没有翻天覆地的改变 , 那么内存管理方案始终是绕不开围绕着作用域的 , 比如C++的RAII以及其延伸出的引用计数 , 所有权等 。
因为作用域非常适合强调上下文关联的逻辑 。 但异步编程的问题就在于 , 它不按套路出牌 , 不是按照指令式编程的上下文关系来执行 , 而是东一榔头西一棒槌 , 这就导致内存管理的难度大幅度上升 。
那解决方案基本分两类 , 要么干脆放弃内存管理 , 高高的举起自己的小白旗并把生杀大权交给GC , 这种自然不在讨论范围内 , 另一种方案就是让异步事件保留自己需要用到的资源的生命周期所有权或知情权 。
大多数语法糖的设计目的都是为了代码复用 。
假设连续的代码块{A{B{C , 代码块B多次出现在不同函数中 , 为了不想重复的敲打代码块B , 聪明的小伙伴们会把代码块B包装成一个函数吧 。
这时候出现了另一种情况 , 有一个函数代码块ABC一个函数ADC 。 这TM就中间不一样 , 上下文都一样 , 想轻松解决复用问题咋整?闭包 装饰器等可以轻而易举地解决这个问题 。
【机器|设计闭包(Closure)的初衷是为了解决什么问题?】最典型的例子就是Python里文件读写 。 正常语言流程都是createfile->openfile->writefile->flushfile->closefile 。 而Python直接使用with语句进行上下文管理 , 你只需要写文件数据 而不需要创建和关闭文件 。 这是contextlib装饰器完成的
- 机器人|手术机器人企业元化智能完成数亿元B轮融资,基石资本领投
- 机器人|国产机器人成长快速“堵点”待解
- 人类|智能机器人作为新一代生产和服务的工具,会对人类带来什么影响?
- 售价不足千元,高度还原色彩的INNOCN显示器,设计师的好伙伴
- 本文转自:大众网转载自高工移动机器人近日|极智嘉的2021:订单额超20亿,龙头初显
- 华为mate x|华为Mate X Rollable卷轴屏,屏幕延伸至背部,一体化设计惊艳
- 华为|华为P60曝光,两大一小设计真全面,无可挑剔让人馋
- 苹果|黑客曝光苹果设计图被抓捕丨新款 iPad 功能曝光,今年春季推出
- 一加科技|一加10 Pro设计丑?看完三星S22渲染图,感觉一加要引领新潮流
- 污渍|每分钟震3000次 石头扫拖机器人G10会声波震动擦地