Embedded (вградени) функция

Използването на функции по-висок ред води до намаление на производителността: Първо, на функцията на даден обект, и второ, има връзка с изземването на затварянето, тоест, функции стават достъпни променливи декларирани извън тялото си. А разпределение на паметта (както за функцията на обекта, както и за своя клас) и виртуални разговори системните ресурси.

Но в много случаи тези "отгоре" може да се елиминира чрез Вграждането (за вграждане) ламбда изрази. Например, заключване () функция може лесно да бъде поставена в мястото, от което тя се нарича:

Вместо да се създава параметър на функция обект и генериране на повикване, компилаторът може да се кандидатира нещо подобно код:

Не е ли това, което искахме първоначално?

За да накарате компилатора да направи точно това, което трябва да се отбележи, модификатор заключване функция в ред на:

инлайн модификатор влияе върху функцията и на ламбда предадения й: и двете от тях ще бъде построен на мястото на повикването.

Вграждане на функция може да се увеличи размерът на генериран код, но ако го направим по разумен (не вгражда големи функции), можете да получите по-добро бързодействие, особено когато се обаждате на функции с параметрите на различни видове в рамките на цикъла.

Ако искате само някои ламбда премина инлайн функции са били построени, трябва да обърнете внимание на модификатора noinline тези функционални параметри, които са вградени няма да:

Когато и двете вграждане ламбда може да бъде причинено рамките инлайн функции или предава, като вградени аргументи с noinline-функции могат да работят без ограничения: съхраняване в рамките на полета мине навсякъде и т.н.

Имайте предвид, че ако инлайн функция е без параметри инлайн или параметри реални тип. компилаторът ще издаде предупреждение, тъй като интеграцията на тази функция е малко вероятно ще бъде от полза (можете да скриете предупреждението ако сте сигурни, че включването е необходимо).

нелокални връщане

В Kotlin можем да използваме обикновени, безусловно връщане само за да излезете от името на функцията или анонимен функция. Това означава, че от ламбда, ние трябва да използвате етикета. Нормално връщане забранено в рамките на Х, защото не може да се направи външната функция завършена.

Но ако е така това е направено функция, която премина ламбда е построен, а след завръщането също ще бъде вградена, можете да:

Такова връщане (вътре lambdas но завършване външна функция) се нарича не-местен (не-местна). Ние използваме тези конструкции в цикли, които са редово функции:

Имайте предвид, че някои инлайн функции могат да причинят ламбда премина към тях не са пряко в тялото на функция, но от различен контекст, като местен обект или вложени функция. В такива случаи, изпълнението не-местен контрол на потока също е забранена в ламбда. За да отбележи това, параметърът ламбда трябва да се отбележи, модификатор crossinline:

прекъсне и да продължи толкова дълго, колкото, че не е на разположение в областта на вградените lambdas, но ние планираме да добавите поддръжка

Параметри на недвижими тип

Понякога трябва да получим достъп от типа премина в като параметър:

В този пример, ние предлагаме един пасаж за дърво и да използвате размисъл за проверка на единица принадлежи към определен тип. Това работи добре, но поканата не изглежда много хубаво:

Това, което наистина искам, е да предадат този тип функция, това е, го наричат ​​така:

В такива случаи най-редово функции могат да приемат параметри на недвижими тип (реифицира параметри тип). За да активирате тази функция, можем да запишем нещо като това:

Ние идентифицирахме типа на параметъра с помощта на реифицира модификатор. но тя е на разположение във функцията почти същото като нормален клас. Тъй като функцията е построена, как! Е, и като отражение не е необходимо за такива оператори. Също така, ние можем да го наречем по същия начин, както е споменато по-горе: myTree.findParentOfType()

Въпреки отражение не може да бъде необходимо в много случаи, ние все още може да го използвате с параметъра недвижими тип:

Нормална функция (не е отбелязана като вградена) не може да има параметри на недвижими тип. Вид, който няма представа за времето за изпълнение (например, без значение тип манекен като Нищо създаване или), не може да се използва като аргумент за параметър тип материал.

За описание на ниско ниво, вижте. Spec.