Uždarymas (informatikos mokslas)
Kompiuterių moksle uždarymas - tai funkcija, turinti savo aplinką. Šioje aplinkoje yra bent vienas susietas kintamasis (vardas, turintis reikšmę, pvz., skaičius). Uždaromosios struktūros aplinka saugo susietus kintamuosius atmintyje tarp uždaromosios struktūros naudojimo atvejų.
1964 m. Peteris J. Landinas šią idėją pavadino uždarymu. Scheme programavimo kalba išpopuliarino uždarymą po 1975 m. Daugelis po to sukurtų programavimo kalbų turi uždarymų.
Anoniminės funkcijos (funkcijos be vardo) kartais klaidingai vadinamos uždarymo funkcijomis. Daugumoje kalbų, kuriose yra anoniminių funkcijų, taip pat yra uždarymų. Anoniminė funkcija taip pat yra uždarymas, jei ji turi savo aplinką su bent vienu susietu kintamuoju. Anoniminė funkcija, neturinti savo aplinkos, nėra uždarymas. Įvardyta uždarymo funkcija nėra anoniminė.
Uždarymai ir pirmos klasės funkcijos
Vertės gali būti skaičiai arba kito tipo duomenys, pavyzdžiui, raidės, arba iš paprastesnių dalių sudarytos duomenų struktūros. Programavimo kalbos taisyklėse pirmos klasės reikšmės yra reikšmės, kurias galima pateikti funkcijoms, grąžinti funkcijomis ir susieti su kintamojo vardu. Funkcijos, kurios priima arba grąžina kitas funkcijas, vadinamos aukštesnės klasės funkcijomis. Dauguma kalbų, kuriose funkcijos yra pirmos klasės reikšmės, taip pat turi aukštesnės eilės funkcijas ir uždarymus.
Pavyzdžiui, pažvelkite į šią Scheme funkciją:
Šiame pavyzdyje lambda išraiška (lambda (book) (>= (book-sales book) threshold))
yra funkcijos best-selling-books
dalis. Kai funkcija paleidžiama, Scheme turi sudaryti lambda išraiškos reikšmę. Tai ji padaro sudarydama uždarymą su lambda kodu ir nuoroda į kintamąjį threshold
, kuris yra laisvas kintamasis lambda viduje. (Laisvasis kintamasis yra vardas, kuris nėra susietas su reikšme.)
Tada filtro
funkcija atlieka kiekvienos sąraše esančios knygos uždarymą ir pasirenka, kurias knygas grąžinti. Kadangi pats uždarymas turi nuorodą į slenkstį,
uždarymas gali naudoti šią vertę kiekvieną kartą, kai filtras
paleidžia uždarymą. Pati filtravimo
funkcija gali būti parašyta visiškai atskirame faile.
Toliau pateikiame tą patį pavyzdį, perrašytą ECMAScript (JavaScript) - kita populiaria kalba, palaikančia uždarymus:
ECMAScript vietoj žodžio lambda
čia naudojamas žodis funkcija,
o vietoj funkcijos filter -
metodas Array.filter,
tačiau kitais atžvilgiais kodas atlieka tą patį dalyką tuo pačiu būdu.
Funkcija gali sukurti uždarymą ir jį grąžinti. Toliau pateiktame pavyzdyje yra funkcija, grąžinanti funkciją.
Schemoje:
In ECMAScript:
Uždarymo aplinka išlaiko susietus kintamuosius f
ir dx
po to, kai grįžta uždarančioji funkcija (išvestinė).
Kalbose, kuriose nėra uždarumo, šios reikšmės būtų prarastos po to, kai grįžta uždarančioji funkcija. Kalbose su uždarosiomis struktūromis susietasis kintamasis turi būti saugomas atmintyje tol, kol jį turi bet kuri uždaroji struktūra.
Uždarymo nebūtina sudaryti naudojant anoniminę funkciją. Pavyzdžiui, "Python" programavimo kalba ribotai palaiko anonimines funkcijas, tačiau turi uždarymo funkcijas. Pavyzdžiui, vienas iš būdų, kaip pirmiau pateiktą ECMAScript pavyzdį būtų galima įgyvendinti Python kalba, yra toks:
Šiame pavyzdyje funkcija, pavadinta gradientu, kartu su kintamaisiais f ir dx sudaro sandarą. Šį uždarumą grąžina išorinė uždarymo funkcija, pavadinta išvestine. Šiuo atveju tiktų ir anoniminė funkcija.
Pythone dažnai tenka naudoti pavadintas funkcijas, nes jo lambda išraiškose gali būti tik kitos išraiškos (kodas, kuris grąžina vertę), bet ne teiginiai (kodas, kuris turi poveikį, bet neturi vertės). Tačiau kitose kalbose, pavyzdžiui, Scheme, visas kodas grąžina vertę; Scheme viskas yra išraiška.
Uždarymo būdai
Uždarymo būdai turi daugybę paskirčių:
- Programinės įrangos bibliotekų projektuotojai gali leisti naudotojams pritaikyti elgseną, perduodami uždarymus kaip argumentus svarbioms funkcijoms. Pavyzdžiui, funkcija, kuri rūšiuoja reikšmes, gali priimti uždarymo argumentą, kuris palygina rūšiuojamas reikšmes pagal naudotojo nustatytą kriterijų.
- Kadangi uždaromosios struktūros atideda vertinimą, t. y. nieko nedaro, kol nėra iškviečiamos, jas galima naudoti valdymo struktūroms apibrėžti. Pavyzdžiui, visos standartinės Smalltalk valdymo struktūros, įskaitant šakas (if/then/else) ir ciklus (while ir for), yra apibrėžtos naudojant objektus, kurių metodai priima uždarymus. Vartotojai taip pat gali lengvai apibrėžti savo valdymo struktūras.
- Gali būti sukurtos kelios funkcijos, kurios uždaromos toje pačioje aplinkoje, todėl jos gali privačiai bendrauti keisdamos tą aplinką (kalbomis, kurios leidžia priskyrimą).
Schemoje
- Uždarymai gali būti naudojami objektų sistemoms įgyvendinti.
Pastaba: kai kurie kalbėtojai bet kokią duomenų struktūrą, kuri susieja leksinę aplinką, vadina uždarymu, tačiau šis terminas paprastai taikomas būtent funkcijoms.
Klausimai ir atsakymai
K: Kas yra kompiuterių mokslo uždarymas?
A: Uždarymas - tai funkcija, turinti savo aplinką.
K: Ką sudaro uždarymo aplinka?
A: Uždarymo aplinkoje yra bent vienas susietas kintamasis.
K: Kas davė uždarumo idėjai pavadinimą?
A.: Peteris J. Landinas 1964 m. pavadino uždarumo idėją.
Klausimas: Kurios programavimo kalbos dėka uždarymai išpopuliarėjo po 1975 m.?
Atsakymas: Po 1975 m. uždaromosios sąvokos išpopuliarėjo programavimo kalba Scheme.
K: Ar anoniminės funkcijos ir uždarymai yra tas pats?
A: Anoniminės funkcijos kartais klaidingai vadinamos užraktais, tačiau ne visos anoniminės funkcijos yra užraktai.
K: Kas anoniminę funkciją paverčia uždarymu?
A: Anoniminė funkcija yra uždarymas, jei ji turi savo aplinką su bent vienu susietu kintamuoju.
K: Ar įvardyta uždarymo funkcija yra anoniminė?
Atsakymas: Ne, įvardyta uždarymo funkcija nėra anoniminė.