0Pricing
Kotlin Academy · Pelajaran

Modifier noinline dan crossinline

Kendalikan perilaku inlining untuk parameter lambda tertentu dalam fungsi inline.

Modifier noinline dan crossinline adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.

Masalah yang Diatasi dan Diperkenalkan oleh inline

Saat suatu fungsi bersifat inline, semua parameter lambda-nya secara bawaan disebariskan. Terkadang Anda perlu agar lambda tertentu tidak disebariskan, misalnya untuk menyimpannya atau meneruskannya ke fungsi non-inline lainnya.

noinline: Mempertahankan Satu Lambda sebagai Objek

Awali parameter lambda tertentu dengan noinline untuk mengecualikannya dari penyebarisan, sementara parameter lainnya tetap disebariskan.

inline fun doWork(
    action: () -> Unit,
    noinline callback: () -> Unit   // stored, not inlined
) {
    action()                        // inlined at call site
    scheduleCallback(callback)      // passed as object — valid
}

Kapan noinline Diperlukan

Anda harus menggunakan noinline ketika lambda:

  • Disimpan dalam variabel atau atribut
  • Diteruskan ke fungsi lain yang mengharapkan tipe fungsi
  • Dikembalikan dari fungsi inline

crossinline: Melarang Pengembalian Nonlokal

crossinline digunakan ketika lambda yang disebariskan akan dipanggil dalam konteks eksekusi yang berbeda, misalnya di dalam lambda lain atau thread lain. Pengubah ini memberi tahu compiler: sebarkan lambda ini, tetapi jangan izinkan pengembalian nonlokal di dalamnya.

inline fun runAsync(crossinline block: () -> Unit) {
    Thread {
        block()   // block is inlined but cannot use non-local return
    }.start()
}

Mengapa Pengembalian Nonlokal Berbahaya di Sini

Jika block dapat menggunakan return nonlokal, kode tersebut akan mencoba mengembalikan nilai dari fungsi yang memanggil runAsync. Namun, saat thread berjalan, fungsi itu mungkin sudah selesai — sehingga menyebabkan perilaku yang tidak terdefinisi. crossinline mencegahnya saat kompilasi.

Menggabungkan noinline dan crossinline

Satu fungsi inline dapat mencampur parameter biasa, noinline, dan crossinline:

inline fun orchestrate(
    crossinline setup: () -> Unit,
    action: () -> Unit,
    noinline teardown: () -> Unit
) {
    Thread { setup() }.start()
    action()
    register(teardown)
}

Kesalahan Compiler Tanpa crossinline

Jika Anda meneruskan lambda yang disebariskan ke konteks lambda tanpa crossinline, compiler menghasilkan: "Tidak dapat menyebariskan 'block' di sini: lambda tersebut mungkin berisi pengembalian nonlokal. Tambahkan pengubah crossinline."

Penggunaan dalam Pustaka Standar

Pustaka standar menggunakan crossinline dalam fungsi seperti Sequence { } dan beberapa pembangun coroutine, untuk memastikan lambda yang disediakan pengguna berjalan dengan aman dalam konteks yang berbeda.

noinline Tidak Membatalkan inline

Menandai satu parameter dengan noinline tidak menonaktifkan penyebarisan untuk seluruh fungsi. Isi fungsi dan semua parameter lambda lainnya tetap disebariskan. Hanya lambda yang ditandai noinline yang mempertahankan identitas objeknya.

Pertimbangan Performa

noinline menimbulkan biaya alokasi lambda yang biasa untuk satu parameter tersebut. crossinline tetap menyebariskan lambda — satu-satunya batasan adalah melarang pengembalian nonlokal. Kedua pengubah ini tidak memengaruhi penyebarisan parameter lainnya.

Tabel Ringkasan

Ringkasan pengubah:

  • Tanpa pengubah → lambda disebariskan sepenuhnya, pengembalian nonlokal diizinkan
  • noinline → lambda dipertahankan sebagai objek dan dapat disimpan atau diteruskan
  • crossinline → lambda disebariskan, tetapi pengembalian nonlokal dilarang

Pemeriksaan Cepat

Kapan Anda harus menggunakan noinline pada parameter lambda dari fungsi inline?

Ringkasan: noinline dan crossinline

Poin penting:

  • noinline: mempertahankan satu lambda sebagai objek di dalam fungsi yang selain itu disebariskan
  • crossinline: menyebariskan lambda, tetapi melarang pengembalian nonlokal agar aman digunakan lintas konteks
  • Kedua pengubah berlaku per parameter, bukan pada seluruh fungsi

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Modifier noinline dan crossinline” gratis?

Ya — teks lengkap “Modifier noinline dan crossinline” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Modifier noinline dan crossinline”?

Kendalikan perilaku inlining untuk parameter lambda tertentu dalam fungsi inline. Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Kotlin Academy?

Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Modifier noinline dan crossinline” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Fungsi inline: Menghilangkan Overhead Lambda
  2. Modifier noinline dan crossinline
  3. Parameter Tipe reified: Mengakses T saat Runtime
  4. Pola Reified Praktis: Parsing, DI, dan Serialisasi
← Kembali ke Kotlin Academy