闭包(计算机科学)是什么?
在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>

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas





Menurut berita pada 31 Julai, Apple mengeluarkan kenyataan akhbar semalam (30 Julai), mengumumkan pelancaran pakej Swift sumber terbuka baharu (swift-homomorphic-encryption) untuk membolehkan penyulitan homomorphic dalam bahasa pengaturcaraan Swift. Nota: Penyulitan Homomorfik (HE) merujuk kepada algoritma penyulitan yang memenuhi sifat operasi homomorfik teks sifir Iaitu, selepas data disulitkan secara homomorfik, pengiraan khusus dilakukan pada teks sifir, dan hasil pengiraan teks sifir yang diperolehi diproses pada masa yang sama. masa. Teks biasa selepas penyahsulitan keadaan adalah bersamaan dengan melakukan pengiraan yang sama secara langsung pada data teks biasa, mencapai "halimunan" data. Teknologi penyulitan homomorfik boleh mengira data yang disulitkan tanpa membocorkan data asas yang tidak disulitkan kepada proses operasi.

Vue.js ialah rangka kerja JavaScript yang popular untuk membina antara muka pengguna. Bahasa Swift ialah bahasa pengaturcaraan yang digunakan untuk pembangunan aplikasi iOS dan macOS. Dalam artikel ini, saya akan meneroka cara mengintegrasikan Vue.js dengan bahasa Swift untuk pembangunan dan ujian aplikasi iOS lanjutan. Sebelum kami bermula, kami perlu memastikan anda memasang perisian dan alatan berikut: Xcode: persekitaran pembangunan bersepadu untuk membangun dan menyusun aplikasi iOS. Node.js: digunakan untuk

Cara melaksanakan fungsi import dan eksport data dalam Swift menggunakan MySQL Mengimport dan mengeksport data adalah salah satu fungsi biasa dalam banyak aplikasi. Artikel ini akan menunjukkan cara menggunakan pangkalan data MySQL untuk mengimport dan mengeksport data dalam bahasa Swift, dan memberikan contoh kod. Untuk menggunakan pangkalan data MySQL, anda perlu memperkenalkan fail perpustakaan yang sepadan terlebih dahulu ke dalam projek Swift. Anda boleh melakukan ini dengan menambah kebergantungan berikut dalam fail Package.swift: dependencies:[

Cara membangunkan fungsi sembang masa nyata menggunakan Redis dan Swift Pengenalan: Fungsi sembang masa nyata telah menjadi bahagian yang amat diperlukan dalam aplikasi sosial moden. Apabila membangunkan aplikasi sosial, kami selalunya perlu menggunakan sembang masa nyata untuk menyediakan interaksi dan pertukaran maklumat antara pengguna. Untuk memenuhi keperluan masa nyata dan ketersediaan tinggi, kami boleh menggunakan Redis dan Swift untuk membangunkan fungsi sedemikian. Pengenalan kepada Redis: Redis ialah sistem storan struktur data dalam memori sumber terbuka, juga dikenali sebagai pelayan struktur data. Ia menyediakan berbilang

Penyepaduan bahasa Vue.js dan Swift, cadangan dan panduan teknikal untuk pembangunan dan ujian aplikasi iOS lanjutan Pengenalan Pembangunan dan ujian aplikasi mudah alih adalah bidang yang kompleks yang memerlukan kemahiran profesional. Dua tindanan teknologi utama ialah Vue.js di bahagian hadapan dan bahasa Swift pada platform iOS. Artikel ini akan memperkenalkan cara mengintegrasikan bahasa Vue.js dan Swift untuk membangunkan dan menguji aplikasi iOS lanjutan. Asas dan ciri Vue.js Vue.js ialah alat untuk membina antara muka pengguna

Apakah bahasa pengaturcaraan yang hampir dengan Go? Dalam beberapa tahun kebelakangan ini, bahasa Go telah muncul secara beransur-ansur dalam bidang pembangunan perisian dan digemari oleh semakin ramai pembangun. Walaupun bahasa Go itu sendiri mempunyai ciri-ciri kesederhanaan, kecekapan dan keselarasan yang kuat, kadangkala ia menghadapi beberapa batasan dan kekurangan. Oleh itu, mencari bahasa pengaturcaraan yang hampir dengan bahasa Go telah menjadi satu keperluan. Berikut akan memperkenalkan beberapa bahasa pengaturcaraan dekat dengan bahasa Go dan menunjukkan persamaannya melalui contoh kod tertentu. RustRust ialah bahasa pengaturcaraan sistem dengan tumpuan pada keselamatan dan keselarasan

Cara menggunakan Redis dan Swift untuk membangunkan fungsi sistem pengesyoran Dalam era Internet hari ini, sistem pengesyoran telah menjadi salah satu fungsi teras bagi banyak aplikasi. Sama ada platform e-dagang, rangkaian sosial atau tapak web video muzik, sistem pengesyoran digunakan secara meluas untuk menyediakan kandungan disyorkan yang diperibadikan dan membantu pengguna menemui dan mendapatkan kandungan yang mungkin menarik minat mereka. Untuk melaksanakan sistem pengesyoran yang cekap dan tepat, Redis dan Swift ialah dua alat berkuasa yang boleh digabungkan untuk mencapai fungsi pengesyoran yang berkuasa. Redis ialah a

PHP ialah bahasa skrip sebelah pelayan yang popular yang digunakan secara meluas untuk membangunkan aplikasi web. PHP boleh digunakan dengan pelayan web dalam pelbagai cara, termasuk Apache, Nginx, dll. Dalam artikel ini, kami akan memberi tumpuan kepada pelayan web dalam PHP, cara ia berfungsi dan cara menggunakan pelayan web dalam PHP. Pelayan web ialah aplikasi rangkaian yang menerima permintaan HTTP dan menghantar respons HTTP. Pelayan web juga boleh mengendalikan fail statik (seperti HTM
