闭包(计算机科学)是什么?
在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闭包是指有权访问另一个函数作用域中的变量的函数,其他语言的不知道(逃 可以和对象的概念对比起来理解,简单地说:
对象是带方法的数据,而闭包是带数据的方法
后半句的数据特指外部数据 一块内存区域,存放着可执行代码和一些变量,指针 学过离散没?在某些集合上某些运算的结果始终在这个集合里,这就叫闭包性质…………虽然和这个闭包一点关系都没有=_=。
闭包在函数式语言当中是一个非常有力的工具,但是有点只可意会的感觉。
简单的来说你可以把闭包看成是绑定了某些变量的值的函数,由于函数式语言中函数是一级对象,所以,这样的性质就非常有用了,比如说可以通过在函数里面返回一些闭包来定义一些数据结构什么的。
举个栗子:
这是我学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>

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









7月31日のニュースによると、Appleは昨日(7月30日)プレスリリースを発行し、Swiftプログラミング言語で準同型暗号化を可能にする新しいオープンソースSwiftパッケージ(swift-homomorphic-encryption)のリリースを発表した。注: 準同型暗号 (HE) とは、暗号文の準同型演算特性を満たす暗号アルゴリズムを指します。つまり、データを準同型暗号化した後、暗号文に対して特定の計算を実行し、得られた暗号文の計算結果を同時に処理します。状態復号後の平文は、平文データに対して同じ計算を直接実行することと同等であり、データの「不可視性」が実現されます。準同型暗号技術は、基になる暗号化されていないデータを運用プロセスに漏らすことなく、暗号化データを計算できます。

Vue.js は、ユーザー インターフェイスを構築するための人気のある JavaScript フレームワークです。 Swift 言語は、iOS および macOS アプリケーションの開発に使用されるプログラミング言語です。この記事では、高度な iOS アプリケーションの開発とテストのために Vue.js を Swift 言語と統合する方法を検討します。始める前に、次のソフトウェアとツールがインストールされていることを確認する必要があります。 Xcode: iOS アプリケーションの開発とコンパイルのための統合開発環境。 Node.js: 用途

MySQL を使用して Swift でデータのインポートおよびエクスポート機能を実装する方法 データのインポートおよびエクスポートは、多くのアプリケーションで一般的な機能の 1 つです。この記事では、MySQL データベースを使用して Swift 言語でデータをインポートおよびエクスポートする方法を示し、コード例を示します。 MySQL データベースを使用するには、まず対応するライブラリ ファイルを Swift プロジェクトに導入する必要があります。これを行うには、Package.swift ファイルに次の依存関係を追加します。

Redis と Swift を使用してリアルタイム チャット機能を開発する方法 はじめに: リアルタイム チャット機能は、現代のソーシャル アプリケーションに不可欠な部分になっています。ソーシャル アプリケーションを開発する場合、多くの場合、ユーザー間の対話や情報交換を提供するためにリアルタイム チャットを使用する必要があります。リアルタイムと高可用性の要件を満たすために、Redis と Swift を使用してそのような機能を開発できます。 Redis の概要: Redis は、オープン ソースのメモリ内データ構造ストレージ システムであり、データ構造サーバーとしても知られています。複数の機能を提供します

Vue.js と Swift 言語の統合、高度な iOS アプリケーションの開発とテストのための提案と技術的ガイダンス はじめに モバイル アプリケーションの開発とテストは、専門的なスキルを必要とする複雑な領域です。 2 つの主要なテクノロジー スタックは、フロントエンドの Vue.js と iOS プラットフォームの Swift 言語です。この記事では、Vue.js と Swift 言語を統合して高度な iOS アプリケーションを開発およびテストする方法を紹介します。 Vue.js の基礎と機能 Vue.js はユーザー インターフェイスを構築するためのツールです

Goに近いプログラミング言語は何ですか?近年、Go 言語はソフトウェア開発の分野で徐々に登場し、ますます多くの開発者に好まれています。 Go 言語自体は、シンプルさ、効率性、強力な同時実行性という特徴を備えていますが、場合によってはいくつかの制限や欠点に遭遇することがあります。したがって、Go 言語に近いプログラミング言語を探す必要があります。以下では、Go 言語に近いいくつかのプログラミング言語を紹介し、具体的なコード例を通してそれらの類似点を示します。 RustRust は、安全性と同時実行性に重点を置いたシステム プログラミング言語です。

Redis と Swift を使用してレコメンデーション システム機能を開発する方法 今日のインターネット時代において、レコメンデーション システムは多くのアプリケーションの中核機能の 1 つとなっています。電子商取引プラットフォーム、ソーシャル ネットワーク、またはミュージック ビデオ Web サイトのいずれであっても、レコメンデーション システムは、パーソナライズされた推奨コンテンツを提供し、ユーザーが興味のあるコンテンツを発見して入手できるようにするために広く使用されています。効率的で正確なレコメンデーション システムを実装するには、Redis と Swift の 2 つの強力なツールを組み合わせて強力なレコメンデーション機能を実現します。リディスは、

PHP は、Web アプリケーションの開発に広く使用されている人気のあるサーバー側スクリプト言語です。 PHP は、Apache、Nginx など、さまざまな方法で Web サーバーで使用できます。この記事では、PHP の Web サーバー、その仕組み、および PHP での Web サーバーの使用方法に焦点を当てます。 Web サーバーは、HTTP 要求を受信し、HTTP 応答を送信するネットワーク アプリケーションです。 Web サーバーは静的ファイル (HTM など) も処理できます。
