Кай вақт ба боргирии функсияҳои inline рӯй медиҳад?
sobes.tech AI
Ҷавоб аз AI
Борбардории функсияҳои inline (inline functions) дар Kotlin дар маънои анъанавии полиморфизм дар вақти иҷро намеоянд. Функсияи inline дар ҷойи даъват дар вақти компилятсия ворид карда мешавад. Аз ин рӯ, вақте ки мо дар бораи "борбардорӣ" дар робита бо функсияҳои inline гап мезанем, одатан мо ба қобилияти компилятор барои истеҳсоли чанд нусхаи коди воридшуда барои контекстҳои даъватҳои гуногун, махсусан дар истифодаи генерикҳо, ишора мекунем.
Мавзӯъҳои асосӣ:
- Таркиби махсус дар вақти компилятсия: Барои функсияҳои inline бо генерикҳо (
reified), компилятор нусхаҳои махсуси коди барои ҳар як навъи мушаххас, ки ба ҷои параметри навъи гузошта мешавад, истеҳсол мекунад. Ин дар вақти компилятсия рӯй медиҳад, на дар вақти иҷро. - Пешгирии зиёдатӣ: Ҳадафи inline бартараф кардани хароҷотҳоест, ки бо даъвати функсия алоқаманданд. Таркиби махсус барои генерикҳо имкон медиҳад, ки бастабандии навъҳои primitives ва дигар хароҷотҳое, ки бо нобуд кардани навъҳо дар Java алоқаманданд, пешгирӣ карда шаванд.
- На polimorfизм: Ин polimorfizm классикӣ нест, ки дар он усули баррасишуда вобаста ба навъи воқеии объект дар вақти иҷро даъват мешавад. Ин ҷо, интихоби "версӣ" ё "нусха"и функсия дар вақти компилятсия рӯй медиҳад.
Масалан истифодаи reified бо функсияи inline:
inline fun <reified T> printType(value: T) {
// Компилятор барои ҳар як T (Int, String ва ғайра) коди ҷудогона истеҳсол мекунад
println("Намудор: ${T::class.java.name}")
}
fun main() {
printType(123) // Код барои T = Int истеҳсол мешавад
printType("Салом") // Код барои T = String истеҳсол мешавад
}
Дар ин ҳолат, ҳарчанд ки мо танҳо як функсия printType-ро даъват мекунем, компилятор ду нусхаи гуногуни коди воридшударо истеҳсол мекунад: яке барои Int ва дигаре барои String. Ин метавонад ҳамчун шакли "борбардорӣ" ё, дақиқтараш, таркиби махсус дар вақти компилятсия ҳисобида шавад, ки бо механизмҳои inline имконпазир аст, на polimorfizm дар вақти иҷро.