在The Swift programming langauge看到closures,但是不太理解是什么,有什么样的特性,能做什么Objective-C做不到的?编程初学者,求指教
回复内容:
要说 Closure 就得说 Closed Lambda Expression,一个 Closed Lambda Expression 就是没有自由变量的 Lambda Expression,如 λx. x,而 λx. yx 就不是 Closed。Closed Lambda Expression 最好的性质之一就是它的类型必然同构于某个逻辑重言式,如 λx. λy. xy 的类型就是「肯定前件」(α → β) → α → β。那么如何把某个 Open Lambda Expression 给 Enclose 住呢?答案就是把它引用的所有自由变量给保存到什么东西里面,这种保存了自由变量的 Lambda Expression 就是 Closure。在其同构的逻辑一面,则是在相继式左边加入前提。
语法上东西我就不说了。
计算机程序可以粗略的分成,代码+数据。初学者很容易就会将这两者对立起来,会认为代码就是代码,数据就是数据,两者是完全不同的。但实际上,两者可以统一起来的。将代码跟数据统一起来,是学习计算机编程的一道门槛。
可以参考,我以前的回答。回调函数是什么?
将数据保存起来,以后再使用,会觉得很自然。但将代码保持起来,以后再使用,很多人会觉得很别扭,难以理解。都是因为还没有过那道槛。
代码指令执行时候,会处于一定的环境,单纯将代码保存下来,还是不够的,需要将代码所处的环境也保存下来。闭包其实是,将代码跟代码所处于的环境做为一个整体来看待。周围的环境,表现为代码所使用的数据。在有些语言中,这个概念叫代码块(block),匿名函数(lambda)等等。
数据跟代码不再人为割裂开来,统一起来看待。闭包就会是很自然的概念。数据可以传递,从一个地方传递到另一个地方,并且以后再使用。闭包从某个角度来说,也是数据,当然也可以传递,从一个函数传递到另一个函数,也可以保持下来,以后再调用。因为将环境也保持下来了,以后调用的时候,就还原当时的情况,延迟执行,就很容易,很自然地实现了。而延迟执行有什么作用?就是另一个话题了。
function makeCounter()
local count = 0
return function()
count = count + 1
return count
end
闭包就是一个函数,或者一个指向函数的指针,加上这个函数执行的非局部变量。说的通俗一点,就是闭包允许一个函数访问声明该函数运行上下文中的变量,甚至可以访问不同运行上文中的变量。
我们用脚本语言来看一下:
<span class="kd">function</span> <span class="nx">funA</span><span class="p">(</span><span class="nx">callback</span><span class="p">){</span>
<span class="nx">alert</span><span class="p">(</span><span class="nx">callback</span><span class="p">());</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nx">funB</span><span class="p">(){</span>
<span class="kd">var</span> <span class="nx">str</span> <span class="o">=</span> <span class="s2">"Hello World"</span><span class="p">;</span> <span class="c1">// 函数funB的局部变量,函数funA的非局部变量</span>
<span class="nx">funA</span><span class="err">(</span>
<span class="kd">function</span><span class="err">()</span><span class="p">{</span>
<span class="k">return</span> <span class="nx">str</span><span class="p">;</span>
<span class="p">}</span>
<span class="err">);</span>
<span class="p">}</span>
Javascript闭包——懂不懂由你,反正我是懂了这个比较容易懂 至少JavaScript闭包是指有权访问另一个函数作用域中的变量的函数,其他语言的不知道(逃 可以和对象的概念对比起来理解,简单地说:
对象是带方法的数据,而闭包是带数据的方法
后半句的数据特指外部数据 一块内存区域,存放着可执行代码和一些变量,指针 学过离散没?在某些集合上某些运算的结果始终在这个集合里,这就叫闭包性质…………虽然和这个闭包一点关系都没有=_=。
闭包在函数式语言当中是一个非常有力的工具,但是有点只可意会的感觉。
简单的来说你可以把闭包看成是绑定了某些变量的值的函数,由于函数式语言中函数是一级对象,所以,这样的性质就非常有用了,比如说可以通过在函数里面返回一些闭包来定义一些数据结构什么的。
举个栗子:
这是我学common lisp 的时候写的一个栈
<span class="p">(</span><span class="nb">defun</span> <span class="nv">stackpush</span> <span class="p">(</span><span class="nv">stack</span> <span class="nv">x</span><span class="p">)</span>
<span class="p">(</span><span class="nb">cons</span> <span class="nf">#'</span><span class="p">(</span><span class="k">lambda</span> <span class="p">()</span> <span class="nv">x</span><span class="p">)</span>
<span class="nf">#'</span><span class="p">(</span><span class="k">lambda</span> <span class="p">()</span> <span class="nv">stack</span><span class="p">)))</span>
<span class="p">(</span><span class="nb">defun</span> <span class="nv">stackpop</span> <span class="p">(</span><span class="nv">stack</span><span class="err">)</span>
<span class="p">(</span><span class="nb">apply</span> <span class="p">(</span><span class="nb">cdr</span> <span class="nv">stack</span><span class="p">)</span><span class="no">nil</span><span class="p">))</span>
<span class="p">(</span><span class="nb">defun</span> <span class="nv">stacktop</span> <span class="p">(</span><span class="nv">stack</span><span class="p">)</span>
<span class="p">(</span><span class="nb">apply</span> <span class="p">(</span><span class="nb">car</span> <span class="nv">stack</span><span class="p">)</span> <span class="no">nil</span><span class="p">))</span>
穷人的类

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

如何解決jieba分詞在景區評論分析中的問題?當我們在進行景區評論分析時,往往會使用jieba分詞工具來處理文�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

Dreamweaver Mac版
視覺化網頁開發工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

禪工作室 13.0.1
強大的PHP整合開發環境