Modyfikatory noinline i crossinline
Kontroluj sposób wstawiania kodu dla wybranych parametrów lambda w funkcjach inline.
Modyfikatory noinline i crossinline to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Problem, który rozwiązuje inline — i który wprowadza
Gdy funkcja jest oznaczona jako inline, domyślnie wstawiane są wszystkie jej parametry lambda. Czasami trzeba sprawić, aby konkretna lambda nie była wstawiana — na przykład aby ją przechować lub przekazać do innej funkcji nieoznaczonej jako inline.
noinline: Zachowanie jednej lambdy jako obiektu
Poprzedź konkretny parametr lambda modyfikatorem noinline, aby wyłączyć go z wstawiania, pozostawiając pozostałe parametry wstawiane.
inline fun doWork(
action: () -> Unit,
noinline callback: () -> Unit // stored, not inlined
) {
action() // inlined at call site
scheduleCallback(callback) // passed as object — valid
}Kiedy potrzebne jest noinline
Modyfikatora noinline musisz użyć, gdy lambda jest:
- przechowywana w zmiennej lub polu
- przekazywana do innej funkcji, która oczekuje typu funkcji
- zwracana z funkcji inline
crossinline: Blokowanie nielokalnych powrotów
crossinline stosuje się, gdy wstawiana lambda będzie wywoływana w innym kontekście wykonania, na przykład wewnątrz innej lambdy lub w innym wątku. Informuje kompilator: wstaw tę lambdę, ale nie zezwalaj w niej na nielokalne powroty.
inline fun runAsync(crossinline block: () -> Unit) {
Thread {
block() // block is inlined but cannot use non-local return
}.start()
}Dlaczego nielokalne powroty są tu niebezpieczne
Gdyby block mogło użyć nielokalnego return, próba powrotu nastąpiłaby z funkcji, która wywołała runAsync. Jednak zanim wątek zostanie uruchomiony, ta funkcja może już zakończyć działanie — prowadziłoby to do niezdefiniowanego zachowania. crossinline zapobiega temu podczas kompilacji.
Łączenie noinline i crossinline
Pojedyncza funkcja inline może łączyć zwykłe parametry oraz parametry noinline i crossinline:
inline fun orchestrate(
crossinline setup: () -> Unit,
action: () -> Unit,
noinline teardown: () -> Unit
) {
Thread { setup() }.start()
action()
register(teardown)
}Błąd kompilatora bez crossinline
Jeśli przekażesz wstawianą lambdę do kontekstu lambda bez crossinline, kompilator zgłosi: „Nie można wstawić elementu 'block' w tym miejscu: może zawierać nielokalne powroty. Dodaj modyfikator crossinline.”
Zastosowanie w bibliotece standardowej
Biblioteka standardowa używa crossinline w funkcjach takich jak Sequence { } oraz w niektórych konstruktorach korutyn, aby zapewnić bezpieczne wykonywanie lambdy dostarczonej przez użytkownika w innym kontekście.
noinline nie wyłącza inline
Oznaczenie jednego parametru jako noinline nie wyłącza wstawiania dla całej funkcji. Treść funkcji oraz wszystkie pozostałe parametry lambda nadal są wstawiane. Tylko lambda oznaczona jako noinline zachowuje swoją tożsamość obiektu.
Uwagi dotyczące wydajności
noinline wiąże się ze standardowym kosztem alokowania lambdy dla tego jednego parametru. crossinline nadal wstawia lambdę — jedynym ograniczeniem jest zakaz nielokalnych powrotów. Żaden z tych modyfikatorów nie wpływa na wstawianie pozostałych parametrów.
Tabela podsumowująca
Podsumowanie modyfikatorów:
- brak modyfikatora → lambda jest w całości wstawiana, a nielokalne powroty są dozwolone
noinline→ lambda pozostaje obiektem i może być przechowywana lub przekazywanacrossinline→ lambda jest wstawiana, ale nielokalne powroty są zabronione
Szybkie sprawdzenie
Kiedy trzeba użyć noinline dla parametru lambda funkcji inline?
Podsumowanie: noinline i crossinline
Najważniejsze wnioski:
noinline: zachowuje jedną lambdę jako obiekt wewnątrz funkcji, której pozostała część jest wstawianacrossinline: wstawia lambdę, ale zabrania nielokalnych powrotów, umożliwiając bezpieczne użycie w różnych kontekstach- oba modyfikatory dotyczą pojedynczych parametrów, a nie całej funkcji
Często zadawane pytania
Czy lekcja „Modyfikatory noinline i crossinline” jest bezpłatna?
Tak — pełny tekst „Modyfikatory noinline i crossinline” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Modyfikatory noinline i crossinline”?
Kontroluj sposób wstawiania kodu dla wybranych parametrów lambda w funkcjach inline. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?
Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Modyfikatory noinline i crossinline”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?
Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Funkcje inline: eliminowanie narzutu lambd
- Modyfikatory noinline i crossinline
- Parametry typów reified: dostęp do T w czasie działania
- Praktyczne wzorce reified: parsowanie, DI i serializacja