0Pricing
Kotlin Academy · Lekcja

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 przekazywana
  • crossinline → 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 wstawiana
  • crossinline: 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

  1. Funkcje inline: eliminowanie narzutu lambd
  2. Modyfikatory noinline i crossinline
  3. Parametry typów reified: dostęp do T w czasie działania
  4. Praktyczne wzorce reified: parsowanie, DI i serializacja
← Powrót do Kotlin Academy