Zapiranje (računalništvo)

V računalništvu je zaključek funkcija, ki ima lastno okolje. V tem okolju je vsaj ena vezana spremenljivka (ime, ki ima vrednost, na primer število). Okolje zaključka hrani vezane spremenljivke v pomnilniku med uporabo zaključka.

Peter J. Landin je leta 1964 to zamisel poimenoval Closure. Programski jezik Scheme je po letu 1975 poskrbel, da so se zaprtja razširila. Številni programski jeziki, ki so nastali po tem času, imajo zaključke.

Anonimne funkcije (funkcije brez imena) se včasih napačno imenujejo zaprtja. Večina jezikov, ki imajo anonimne funkcije, ima tudi zaključke. Anonimna funkcija je tudi zaključek, če ima lastno okolje z vsaj eno vezano spremenljivko. Anonimna funkcija brez lastnega okolja ni zaključek. Poimenovana zapiralna funkcija ni anonimna.

Zapiranje in prvovrstne funkcije

Vrednosti so lahko številke ali druge vrste podatkov, na primer črke, ali podatkovne strukture, sestavljene iz enostavnejših delov. V pravilih programskega jezika so vrednosti prvega razreda vrednosti, ki jih lahko podamo funkcijam, jih funkcije vrnejo in se vežejo na ime spremenljivke. Funkcije, ki sprejemajo ali vračajo druge funkcije, se imenujejo funkcije višjega reda. Večina jezikov, ki imajo funkcije kot vrednosti prvega razreda, ima tudi funkcije višjega reda in zapore.

Oglejte si na primer naslednjo funkcijo sheme:

; Vrnite seznam vseh knjig, ki so bile prodane v najmanj TISOČERAZREDNIH izvodih. (define (best-selling-books threshold) (filter (lambda (book) (>= (book-sales book) threshold)) book-list)))

V tem primeru je izraz lambda (lambda (book) (>= (book-sales book) threshold)) del funkcije best-selling-books. Ko se funkcija zažene, mora Scheme ustvariti vrednost izraza lambda. To stori tako, da ustvari zaključek s kodo za lambdo in referenco na spremenljivko prag, ki je prosta spremenljivka znotraj lambde. (Prosta spremenljivka je ime, ki ni vezano na vrednost.)

Funkcija filtra nato izvede zaključek za vsako knjigo na seznamu in izbere knjige, ki jih bo vrnila. Ker ima zaključek sam referenco na prag, lahko zaključek uporabi to vrednost vsakič, ko filter zažene zaključek. Sama funkcija filter je lahko zapisana v popolnoma ločeni datoteki.

Isti primer je prepisan v jeziku ECMAScript (JavaScript), še enem priljubljenem jeziku s podporo za zapiranje:

// Vrnite seznam vseh knjig s prodanimi izvodi vsaj v vrednosti 'prag'. function bestSellingBooks(prag) { return bookList. filter( function(book) { return book. sales >= threshold; }     ); }

ECMAScript namesto lambda uporablja besedo function, namesto funkcije filter pa metodo Array.filter, sicer pa koda izvaja isto stvar na enak način.

Funkcija lahko ustvari zaključek in ga vrne. Naslednji primer je funkcija, ki vrne funkcijo.

V shemi:

; Vrnite funkcijo, ki aproksimira derivativ f ; z uporabo intervala dx, ki mora biti primerno majhen. (define (derivative f dx) (lambda (x) (/ (- (f (+ x dx)) (f x)) dx))))

V ECMAScriptu:

// Vrnite funkcijo, ki aproksimira derivativ f // z uporabo intervala dx, ki mora biti primerno majhen. funkcija derivative(f, dx) { return function(x) { return (f(x + dx) - f(x))) / dx; }; }; }

Okolje zapiranja ohrani vezani spremenljivki f in dx tudi po vrnitvi obkrožujoče funkcije (derivata). V jezikih brez zaprtja bi se ti vrednosti po vrnitvi obkrožujoče funkcije izgubili. V jezikih z zaprtji je treba vezano spremenljivko hraniti v pomnilniku, dokler jo ima katero koli zaprtje.

Zaprtja ni treba oblikovati z anonimno funkcijo. Programski jezik Python, na primer, ima omejeno podporo za anonimne funkcije, vendar ima zaključke. Na primer, zgornji primer ECMAScript bi lahko v jeziku Python izvedli na naslednji način:

# Vrnite funkcijo, ki aproksimira derivativ f # z uporabo intervala dx, ki mora biti primerno majhen. def derivative(f, dx): def gradient(x): return (f(x + dx) - f(x)) / dx return gradient

V tem primeru je funkcija z imenom gradient skupaj s spremenljivkama f in dx zaprta. Funkcija z imenom derivativ vrne to zaprtje. V tem primeru bi delovala tudi anonimna funkcija.

def derivative(f, dx): return lambda x: (f(x + dx) - f(x)) / dx

Python mora namesto tega pogosto uporabljati poimenovane funkcije, saj lahko njegovi lambda izrazi vsebujejo le druge izraze (kodo, ki vrača vrednost) in ne izjav (kodo, ki ima učinke, vendar nima vrednosti). V drugih jezikih, kot je Scheme, pa vsa koda vrača vrednost; v Scheme je vse izraz.

Uporaba zaključkov

Zapirala se lahko uporabljajo za številne namene:

  • Oblikovalci programskih knjižnic lahko uporabnikom omogočijo, da prilagodijo obnašanje tako, da pomembnim funkcijam kot argumente posredujejo zapore. Na primer, funkcija, ki razvršča vrednosti, lahko sprejme argument zapore, ki primerja vrednosti, ki jih je treba razvrstiti v skladu z uporabniško opredeljenim merilom.
  • Ker zaključki odložijo vrednotenje, tj. ne naredijo ničesar, dokler jih ne pokličemo, jih lahko uporabimo za definiranje nadzornih struktur. Vse standardne kontrolne strukture Smalltalka, vključno z vejami (if/then/else) in zankami (while in for), so na primer definirane s predmeti, katerih metode sprejemajo zapore. Uporabniki lahko enostavno definirajo tudi svoje lastne kontrolne strukture.
  • Izdelati je mogoče več funkcij, ki so si blizu v istem okolju, kar jim omogoča zasebno komunikacijo s spreminjanjem tega okolja (v jezikih, ki omogočajo dodeljevanje).

V shemi

(define foo #f) (define bar #f) (let ((secret-message "none")) (set! foo (lambda (msg) (set! secret-message msg))) (set! bar (lambda () secret-message))) (display (bar)) ; izpiše "none" (newline) (foo "meet me by the docks at midnight") (display (bar)) ; izpiše "meet me by the docks at midnight"
  • Zapore lahko uporabite za izvajanje objektnih sistemov.

Opomba: Nekateri govorci vsako podatkovno strukturo, ki povezuje leksikalno okolje, imenujejo zaključek, vendar se ta izraz običajno nanaša predvsem na funkcije.

Vprašanja in odgovori

V: Kaj je zaključek v računalništvu?


O: Zaključek je funkcija, ki ima lastno okolje.

V: Kaj vsebuje okolje zaključka?


O: Okolje zaključka vsebuje vsaj eno vezano spremenljivko.

V: Kdo je dal ideji o zaprtju ime?


O: Peter J. Landin je leta 1964 poimenoval zamisel o zaprtju.

V: V katerem programskem jeziku so bile zapore priljubljene po letu 1975?


O: Programski jezik Scheme je po letu 1975 populariziral zapore.

V: Ali so anonimne funkcije in zaprtja ista stvar?


O: Anonimne funkcije se včasih napačno imenujejo zapore, vendar vse anonimne funkcije niso zapore.

V: Kaj naredi anonimno funkcijo za zaključek?


O: Anonimna funkcija je zaključek, če ima lastno okolje z vsaj eno vezano spremenljivko.

V: Ali je poimenovana zapiralna funkcija anonimna?


O: Ne, poimenovana zapiralna funkcija ni anonimna.

AlegsaOnline.com - 2020 / 2023 - License CC3