Inhaltsverzeichnis
回复内容:
Heim Backend-Entwicklung Python-Tutorial 闭包(计算机科学)是什么?

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

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
Nach dem Login kopieren
闭包就是一个函数,或者一个指向函数的指针,加上这个函数执行的非局部变量。
说的通俗一点,就是闭包允许一个函数访问声明该函数运行上下文中的变量,甚至可以访问不同运行上文中的变量。
我们用脚本语言来看一下:
<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>
Nach dem Login kopieren
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>
Nach dem Login kopieren
穷人的类
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Apple veröffentlicht Open-Source-Swift-Paket für homomorphe Verschlüsselung, bereitgestellt in iOS 18 Apple veröffentlicht Open-Source-Swift-Paket für homomorphe Verschlüsselung, bereitgestellt in iOS 18 Jul 31, 2024 pm 01:10 PM

Laut Nachrichten vom 31. Juli hat Apple gestern (30. Juli) eine Pressemitteilung herausgegeben, in der die Einführung eines neuen Open-Source-Swift-Pakets (swift-homomorphic-encryption) zur Ermöglichung homomorpher Verschlüsselung in der Programmiersprache Swift angekündigt wird. Hinweis: Homomorphe Verschlüsselung (HE) bezieht sich auf einen Verschlüsselungsalgorithmus, der die homomorphen Operationseigenschaften von Chiffretext erfüllt. Das heißt, nach der homomorphen Verschlüsselung der Daten werden spezifische Berechnungen für den Chiffretext durchgeführt und die erhaltenen Chiffretext-Berechnungsergebnisse werden gleichzeitig verarbeitet Der Klartext nach der Zustandsentschlüsselung entspricht der direkten Durchführung derselben Berechnung für die Klartextdaten, wodurch die „Unsichtbarkeit“ der Daten erreicht wird. Die homomorphe Verschlüsselungstechnologie kann verschlüsselte Daten berechnen, ohne dass die zugrunde liegenden unverschlüsselten Daten an den Betriebsprozess weitergegeben werden.

Integration von Vue.js und Swift-Sprache, Vorschläge für die Entwicklung und das Testen erweiterter iOS-Anwendungen Integration von Vue.js und Swift-Sprache, Vorschläge für die Entwicklung und das Testen erweiterter iOS-Anwendungen Aug 01, 2023 am 09:53 AM

Vue.js ist ein beliebtes JavaScript-Framework zum Erstellen von Benutzeroberflächen. Die Swift-Sprache ist eine Programmiersprache, die für die Entwicklung von iOS- und macOS-Anwendungen verwendet wird. In diesem Artikel werde ich untersuchen, wie man Vue.js in die Swift-Sprache integriert, um fortgeschrittene iOS-Anwendungsentwicklung und -Tests zu ermöglichen. Bevor wir beginnen, müssen wir sicherstellen, dass Sie die folgende Software und Tools installiert haben: Xcode: eine integrierte Entwicklungsumgebung zum Entwickeln und Kompilieren von iOS-Anwendungen. Node.js: verwendet für

So verwenden Sie MySQL, um Datenimport- und -exportfunktionen in Swift zu implementieren So verwenden Sie MySQL, um Datenimport- und -exportfunktionen in Swift zu implementieren Aug 01, 2023 pm 11:57 PM

So implementieren Sie Datenimport- und -exportfunktionen in Swift mithilfe von MySQL. Das Importieren und Exportieren von Daten ist eine der allgemeinen Funktionen in vielen Anwendungen. In diesem Artikel wird gezeigt, wie Sie die MySQL-Datenbank zum Importieren und Exportieren von Daten in der Swift-Sprache verwenden, und es werden Codebeispiele bereitgestellt. Um die MySQL-Datenbank nutzen zu können, müssen Sie zunächst die entsprechende Bibliotheksdatei in das Swift-Projekt einführen. Sie können dies tun, indem Sie die folgenden Abhängigkeiten in der Datei Package.swift hinzufügen: dependencies:[

So entwickeln Sie eine Echtzeit-Chat-Funktion mit Redis und Swift So entwickeln Sie eine Echtzeit-Chat-Funktion mit Redis und Swift Sep 20, 2023 pm 12:31 PM

So entwickeln Sie eine Echtzeit-Chat-Funktion mit Redis und Swift Einführung: Die Echtzeit-Chat-Funktion ist zu einem unverzichtbaren Bestandteil moderner sozialer Anwendungen geworden. Bei der Entwicklung sozialer Anwendungen müssen wir häufig Echtzeit-Chat verwenden, um die Interaktion und den Informationsaustausch zwischen Benutzern zu ermöglichen. Um den Anforderungen an Echtzeit und Hochverfügbarkeit gerecht zu werden, können wir Redis und Swift verwenden, um eine solche Funktion zu entwickeln. Einführung in Redis: Redis ist ein Open-Source-In-Memory-Datenstrukturspeichersystem, das auch als Datenstrukturserver bezeichnet wird. Es bietet mehrere

Integration von Vue.js und der Swift-Sprache, um Vorschläge und technische Anleitungen für die Entwicklung und das Testen erweiterter iOS-Anwendungen zu erhalten Integration von Vue.js und der Swift-Sprache, um Vorschläge und technische Anleitungen für die Entwicklung und das Testen erweiterter iOS-Anwendungen zu erhalten Jul 29, 2023 pm 01:06 PM

Integration der Vue.js- und Swift-Sprache, Vorschläge und technische Anleitungen für die Entwicklung und das Testen fortgeschrittener iOS-Anwendungen. Einführung Die Entwicklung und das Testen mobiler Anwendungen ist ein komplexer Bereich, der professionelle Fähigkeiten erfordert. Die beiden wichtigsten Technologie-Stacks sind Vue.js im Frontend und Swift Language auf der iOS-Plattform. In diesem Artikel wird erläutert, wie Sie Vue.js und die Swift-Sprache integrieren, um erweiterte iOS-Anwendungen zu entwickeln und zu testen. Grundlagen und Funktionen von Vue.js Vue.js ist ein Tool zum Erstellen von Benutzeroberflächen

Welche Programmiersprachen kommen Go nahe? Welche Programmiersprachen kommen Go nahe? Mar 23, 2024 pm 02:03 PM

Welche Programmiersprachen kommen Go nahe? In den letzten Jahren hat sich die Go-Sprache nach und nach im Bereich der Softwareentwicklung etabliert und wird von immer mehr Entwicklern bevorzugt. Obwohl die Go-Sprache selbst die Merkmale Einfachheit, Effizienz und starke Parallelität aufweist, weist sie manchmal einige Einschränkungen und Mängel auf. Daher ist die Suche nach einer Programmiersprache, die der Go-Sprache nahe kommt, zu einem Bedarf geworden. Im Folgenden werden einige der Go-Sprache nahestehende Programmiersprachen vorgestellt und ihre Ähnlichkeiten anhand spezifischer Codebeispiele demonstriert. RustRust ist eine Systemprogrammiersprache mit Schwerpunkt auf Sicherheit und Parallelität

So entwickeln Sie Empfehlungssystemfunktionen mit Redis und Swift So entwickeln Sie Empfehlungssystemfunktionen mit Redis und Swift Sep 21, 2023 pm 02:09 PM

So verwenden Sie Redis und Swift zur Entwicklung von Empfehlungssystemfunktionen. Im heutigen Internetzeitalter sind Empfehlungssysteme zu einer der Kernfunktionen vieler Anwendungen geworden. Ob E-Commerce-Plattformen, soziale Netzwerke oder Musikvideo-Websites: Empfehlungssysteme werden häufig verwendet, um personalisierte empfohlene Inhalte bereitzustellen und Benutzern dabei zu helfen, Inhalte zu entdecken und zu erhalten, die für sie von Interesse sein könnten. Um ein effizientes und genaues Empfehlungssystem zu implementieren, sind Redis und Swift zwei leistungsstarke Tools, die kombiniert werden können, um eine leistungsstarke Empfehlungsfunktion zu erreichen. Redis ist ein

Webserver in PHP Webserver in PHP May 23, 2023 am 11:31 AM

PHP ist eine beliebte serverseitige Skriptsprache, die häufig zur Entwicklung von Webanwendungen verwendet wird. PHP kann auf verschiedene Weise mit Webservern verwendet werden, einschließlich Apache, Nginx usw. In diesem Artikel konzentrieren wir uns auf Webserver in PHP, ihre Funktionsweise und die Verwendung von Webservern in PHP. Ein Webserver ist eine Netzwerkanwendung, die HTTP-Anfragen empfängt und HTTP-Antworten sendet. Webserver können auch statische Dateien (wie HTM) verarbeiten

See all articles