Embedded funcția (inline)

Utilizarea funcțiilor de ordin superior implică o reducere a productivității: În primul rând, funcția unui obiect, și în al doilea rând, există contextul confiscării de închidere, adică, funcțiile devin disponibile variabile declarate în afara corpului ei. O alocare de memorie (ca pentru funcția obiectului, cât și pentru clasa sa) și de apel resurse de sistem virtuale.

Dar, în multe cazuri, aceste „deasupra capului“, pot fi eliminate prin Încorporarea (înglobare) expresii lambda. De exemplu, funcția de blocare () poate fi ușor introdus în locul din care se numește:

In loc de a crea un parametru obiect funcția și generarea unui apel, compilatorul ar putea rula ceva de genul acest cod:

Nu este că ceea ce ne-am dorit inițial?

Pentru a forța compilator de a face doar asta, trebuie să menționăm inline funcția de blocare modificator:

modificator inline afectează funcția și pe lambda a trecut la ea: ambele dintre ele va fi construit în locul apelului.

Funcția Încorporarea poate crește cantitatea de cod generat, dar dacă o faci într-un termen rezonabil (nu inline funcții mari), veți obține un impuls de performanță, mai ales atunci când funcțiile de asteptare cu parametrii de diferite tipuri în cadrul ciclurilor.

Dacă doriți doar unele lambda trecut inline-funcții au fost construite, trebuie să rețineți modificatorul noinline acei parametri ai funcției pe care sunt construite nu:

Atunci când ambele lambda încastrate pot fi cauzate în cadrul inline-funcții sau transmise ca argumente încorporate cu noinline-funcții pot funcționa fără restricții: stocarea în interiorul câmpurilor trece oriunde etc.

Rețineți că, în cazul în care inline-funcția nu are parametri in linie sau parametri de tip reale. compilatorul va emite un avertisment, ca și integrarea acestei funcții este puțin probabil va beneficia (vă puteți ascunde avertismentul dacă sunteți sigur că încorporarea este necesară).

întoarcere nelocal

Kotlin putem folosi ordinare întoarcere, necondiționat doar pentru a ieși din funcția de nume sau o funcție anonimă. Acest lucru înseamnă că, dintr-o lambda, avem nevoie de a utiliza eticheta. întoarcere normală interzisă în lambda, deoarece nu se poate face funcția externă finalizată.

Dar dacă acest lucru se face funcție, care a trecut lambda este construit, atunci randamentul va fi construit, puteți:

O astfel de întoarcere (în interiorul dar funcția externă Lambda finalizare) sunt numite non-locale (non-locale). Noi folosim astfel de construcții în cicluri care sunt inline-funcții:

Rețineți că unele funcții inline-poate provoca lambda a trecut la ele, nu direct în corpul funcției, ci dintr-un alt context, cum ar fi un obiect local sau funcția imbricate. În astfel de cazuri, executarea de control al fluxului de bază non-locală este, de asemenea, interzisă în lambda. Pentru a indica acest lucru, parametrul lambda trebuie remarcat modificator crossinline:

pauză și să continue atât timp cât aceasta nu este disponibilă în integrate Lambda, dar intenționăm să adăugați suport

Parametrii de tip real,

Uneori avem nevoie pentru a avea acces la tipul trecut într-un parametru:

În acest exemplu, noi oferim un pasaj pentru lemn și de a folosi reflecție pentru a verifica unitatea aparține unui anumit tip. Aceasta funcționează bine, dar apelul nu arata foarte frumos:

Ceea ce vrem cu adevărat este de a transmite acest tip de funcție, adică, numesc astfel:

În astfel de cazuri, inline-funcții pot accepta parametrii unui tip real, (parametri de tip reificate). Pentru a activa această caracteristică, putem scrie ceva de genul:

Am identificat tipul parametrului folosind modificatorul reificată. dar este disponibil în funcția aproape la fel ca și o clasă normală. Deoarece funcția este construit, cum! Este, și ca o reflectare nu este necesară pentru astfel de operatori. De asemenea, putem numi în același mod ca și a menționat mai sus: myTree.findParentOfType()

Deși reflecție nu poate fi necesară, în multe cazuri, putem folosi în continuare cu parametrul de tip real:

Funcția normală (nu este marcată ca built-in), nu pot avea un tip de parametri reali. Tipul, care nu are nici o idee despre timpul de execuție (de exemplu, stabilirea sau tip imaterială fals ca nimic), nu poate fi folosit ca argument pentru parametrul de tip de material.

Pentru o descriere de nivel scăzut, a se vedea. Spec.