闭包(计算机科学)是什么?
在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
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











7월 31일 뉴스에 따르면, Apple은 어제(30일) 보도 자료를 통해 Swift 프로그래밍 언어에서 동형 암호화를 가능하게 하는 새로운 오픈 소스 Swift 패키지(swift-homomorphic-encryption)의 출시를 발표했습니다. 참고: HE(동형암호)는 암호문의 동형연산 특성을 만족하는 암호화 알고리즘을 의미합니다. 즉, 데이터를 동형암호화한 후 암호문에 대해 특정 계산을 수행하고, 얻은 암호문 계산 결과를 동시에 처리합니다. 상태 암호 해독 후의 일반 텍스트는 일반 텍스트 데이터에 대해 동일한 계산을 직접 수행하여 데이터의 "보이지 않음"을 달성하는 것과 같습니다. 동형암호 기술은 암호화되지 않은 기본 데이터를 연산 프로세스에 유출하지 않고 암호화된 데이터를 계산할 수 있습니다.

Vue.js는 사용자 인터페이스 구축에 널리 사용되는 JavaScript 프레임워크입니다. Swift 언어는 iOS 및 macOS 애플리케이션 개발에 사용되는 프로그래밍 언어입니다. 이 기사에서는 고급 iOS 애플리케이션 개발 및 테스트를 위해 Vue.js를 Swift 언어와 통합하는 방법을 살펴보겠습니다. 시작하기 전에 다음 소프트웨어와 도구가 설치되어 있는지 확인해야 합니다. Xcode: iOS 애플리케이션 개발 및 컴파일을 위한 통합 개발 환경입니다. Node.js: 다음 용도로 사용됨

MySQL을 사용하여 Swift에서 데이터 가져오기 및 내보내기 기능을 구현하는 방법 데이터 가져오기 및 내보내기는 많은 애플리케이션에서 일반적인 기능 중 하나입니다. 이 기사에서는 MySQL 데이터베이스를 사용하여 Swift 언어로 데이터를 가져오고 내보내는 방법을 보여주고 코드 예제를 제공합니다. MySQL 데이터베이스를 사용하려면 먼저 해당 라이브러리 파일을 Swift 프로젝트에 도입해야 합니다. Package.swift 파일에 다음 종속성을 추가하여 이를 수행할 수 있습니다: 종속성:[

Redis 및 Swift를 사용하여 실시간 채팅 기능을 개발하는 방법 소개: 실시간 채팅 기능은 현대 소셜 애플리케이션에서 없어서는 안 될 부분이 되었습니다. 소셜 애플리케이션을 개발할 때 사용자 간의 상호 작용 및 정보 교환을 제공하기 위해 실시간 채팅을 사용해야 하는 경우가 많습니다. 실시간 및 고가용성 요구 사항을 충족하기 위해 Redis 및 Swift를 사용하여 이러한 기능을 개발할 수 있습니다. Redis 소개: Redis는 데이터 구조 서버라고도 알려진 오픈 소스 인메모리 데이터 구조 스토리지 시스템입니다. 그것은 여러 가지를 제공합니다

Vue.js 및 Swift 언어 통합, 고급 iOS 애플리케이션 개발 및 테스트를 위한 제안 및 기술 지침 소개 모바일 애플리케이션의 개발 및 테스트는 전문적인 기술이 필요한 복잡한 분야입니다. 두 가지 주요 기술 스택은 프런트 엔드의 Vue.js와 iOS 플랫폼의 Swift 언어입니다. 이 기사에서는 Vue.js와 Swift 언어를 통합하여 고급 iOS 애플리케이션을 개발하고 테스트하는 방법을 소개합니다. Vue.js의 기본 및 기능 Vue.js는 사용자 인터페이스를 구축하기 위한 도구입니다.

Go에 가까운 프로그래밍 언어는 무엇입니까? 최근 몇 년 동안 소프트웨어 개발 분야에서 Go 언어가 점차 등장했으며 점점 더 많은 개발자가 선호하고 있습니다. Go 언어 자체는 단순성, 효율성 및 강력한 동시성이라는 특성을 갖고 있지만 때로는 몇 가지 제한 사항과 단점에 직면합니다. 따라서 Go 언어에 가까운 프로그래밍 언어를 찾는 것이 필요해졌습니다. 다음은 Go 언어에 가까운 일부 프로그래밍 언어를 소개하고 구체적인 코드 예제를 통해 이들의 유사점을 보여줍니다. RustRust는 안전과 동시성에 초점을 맞춘 시스템 프로그래밍 언어입니다.

Redis 및 Swift를 사용하여 추천 시스템 기능을 개발하는 방법 오늘날 인터넷 시대에 추천 시스템은 많은 애플리케이션의 핵심 기능 중 하나가 되었습니다. 전자상거래 플랫폼, 소셜 네트워크, 뮤직 비디오 웹사이트 등 추천 시스템은 개인화된 추천 콘텐츠를 제공하고 사용자가 관심을 가질 만한 콘텐츠를 발견하고 얻을 수 있도록 돕는 데 널리 사용됩니다. 효율적이고 정확한 추천 시스템을 구현하기 위해 Redis와 Swift는 결합하여 강력한 추천 기능을 달성할 수 있는 두 가지 강력한 도구입니다. 레디스는

PHP는 웹 애플리케이션 개발에 널리 사용되는 널리 사용되는 서버 측 스크립팅 언어입니다. PHP는 Apache, Nginx 등 다양한 방식으로 웹 서버와 함께 사용할 수 있습니다. 이 기사에서는 PHP의 웹 서버, 작동 방식 및 PHP에서 웹 서버를 사용하는 방법에 중점을 둘 것입니다. 웹 서버는 HTTP 요청을 수신하고 HTTP 응답을 보내는 네트워크 애플리케이션입니다. 웹 서버는 정적 파일(예: HTM)도 처리할 수 있습니다.
