目錄
回复内容:
首頁 後端開發 Python教學 闭包(计算机科学)是什么?

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

Jun 06, 2016 pm 04:22 PM
programming swift

在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>
登入後複製
穷人的类
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

蘋果發布用於同態加密的開源 Swift 軟體包,已部署在 iOS 18 中 蘋果發布用於同態加密的開源 Swift 軟體包,已部署在 iOS 18 中 Jul 31, 2024 pm 01:10 PM

7月31日消息,蘋果昨天(7月30日)發布新聞稿,宣布推出新的開源Swift包(swift-homomorphic-encryption),用於在Swift程式語言中啟用同態加密。註:同態加密(HomomorphicEncryption,HE)是指滿足密文同態運算性質的加密演算法,即資料經過同態加密之後,對密文進行特定的計算,得到的密文計算結果在進行對應的同態解密後的明文等同於明文資料直接進行相同的計算,實現資料的「可算不可見」。同態加密技術可以計算加密數據,而且不會向操作過程洩漏底層的未加

如何使用MySQL在Swift中實作資料匯入和匯出功能 如何使用MySQL在Swift中實作資料匯入和匯出功能 Aug 01, 2023 pm 11:57 PM

如何使用MySQL在Swift中實作資料匯入和匯出功能匯入和匯出資料是許多應用程式中常見的功能之一。本文將展示在Swift語言中使用MySQL資料庫實作資料匯入和匯出的方法,並提供程式碼範例。要使用MySQL資料庫,首先需要在Swift專案中引入對應的庫檔案。你可以透過在Package.swift檔案中加入以下依賴來實現:dependencies:[

Vue.js與Swift語言的集成,實現高階iOS應用的開發與測試的建議 Vue.js與Swift語言的集成,實現高階iOS應用的開發與測試的建議 Aug 01, 2023 am 09:53 AM

Vue.js是一種流行的JavaScript框架,用於建立使用者介面。而Swift語言是一種用於iOS和macOS應用程式開發的程式語言。在本文中,我將探討如何將Vue.js與Swift語言集成,以實現高級iOS應用程式的開發和測試。在開始之前,我們需要確保你已經安裝了以下軟體和工具:Xcode:用於開發和編譯iOS應用程式的整合開發環境。 Node.js:用於

如何使用Redis和Swift開發即時聊天功能 如何使用Redis和Swift開發即時聊天功能 Sep 20, 2023 pm 12:31 PM

如何使用Redis和Swift開發即時聊天功能引言:即時聊天功能已經成為現代社交應用中不可或缺的一部分。在開發社交應用程式時,我們經常需要使用即時聊天來提供用戶之間的互動和資訊交流。為了達到即時性和高可用性的要求,我們可以使用Redis和Swift來開發這樣一個功能。 Redis簡介:Redis是一個開源的記憶體資料結構儲存系統,也被稱為資料結構伺服器。它透過提供多

與Go接近的程式語言有哪些? 與Go接近的程式語言有哪些? Mar 23, 2024 pm 02:03 PM

與Go接近的程式語言有哪些?近年來,Go語言在軟體開發領域逐漸嶄露頭角,受到越來越多開發者的青睞。雖然Go語言本身擁有簡潔、高效和並發性強的特點,但有時也會遇到一些限制和不足。因此,尋找與Go語言接近的程式語言成為了一種需求。以下將介紹一些與Go語言接近的程式語言,並透過具體程式碼範例展示它們的相似之處。 RustRust是一種系統程式語言,注重安全性和併發性

Vue.js與Swift語言的集成,實現高級iOS應用的開發和測試的建議和技術指導 Vue.js與Swift語言的集成,實現高級iOS應用的開發和測試的建議和技術指導 Jul 29, 2023 pm 01:06 PM

Vue.js與Swift語言的集成,實現高級iOS應用的開發和測試的建議和技術指導引言移動應用的開發和測試是一個複雜且需要專業技術的領域。兩個主要的技術堆疊分別是前端的Vue.js和iOS平台的Swift語言。本文將介紹如何將Vue.js和Swift語言進行集成,以便開發和測試高階的iOS應用。 Vue.js的基本原理和功能Vue.js是一種用來建立使用者介面的

如何使用Redis和Swift開發推薦系統功能 如何使用Redis和Swift開發推薦系統功能 Sep 21, 2023 pm 02:09 PM

如何使用Redis和Swift開發推薦系統功能在當今互聯網時代,推薦系統已成為許多應用的核心功能之一。無論是電商平台、社群網路或音樂影片網站,都廣泛使用推薦系統來提供個人化的推薦內容,幫助用戶發現並獲得他們可能感興趣的內容。要實現一個高效和準確的推薦系統,Redis和Swift是兩個強大的工具,可以透過它們的組合來實現一個強大的推薦功能。 Redis是一個

PHP中的Web伺服器 PHP中的Web伺服器 May 23, 2023 am 11:31 AM

PHP是一種流行的伺服器端腳本語言,它廣泛用於開發網頁應用程式。 PHP可以以各種方式與Web伺服器搭配使用,包括Apache、Nginx等。在本文中,我們將重點討論PHP中的Web伺服器,其工作原理以及如何在PHP中使用Web伺服器。 Web伺服器是一種網頁應用程序,用於接收HTTP請求並發送HTTP回應。 Web伺服器也可以處理靜態檔案(如HTM

See all articles