Modificadores noinline y crossinline
Controle el comportamiento de inline para parámetros lambda específicos en funciones inline.
Modificadores noinline y crossinline es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.
El problema que inline resuelve y plantea
Cuando una función es inline, todos sus parámetros lambda se insertan inline de forma predeterminada. A veces necesita que una lambda concreta no se inserte inline; por ejemplo, para almacenarla o pasarla a otra función que no sea inline.
noinline: conservar una lambda como objeto
Anteponer noinline a un parámetro lambda concreto evita su inserción inline, mientras que el resto se sigue insertando inline.
inline fun doWork(
action: () -> Unit,
noinline callback: () -> Unit // stored, not inlined
) {
action() // inlined at call site
scheduleCallback(callback) // passed as object — valid
}Cuándo es necesario noinline
Debe usar noinline cuando la lambda:
- Se almacena en una variable o un campo
- Se pasa a otra función que espera un tipo de función
- Se devuelve desde la función inline
crossinline: prohibir los retornos no locales
crossinline se usa cuando una lambda insertada inline se invoca en un contexto de ejecución diferente (por ejemplo, dentro de otra lambda o en otro hilo). Indica al compilador: inserte esta lambda inline, pero no permita retornos no locales dentro de ella.
inline fun runAsync(crossinline block: () -> Unit) {
Thread {
block() // block is inlined but cannot use non-local return
}.start()
}Por qué los retornos no locales son peligrosos aquí
Si block pudiera usar un return no local, intentaría retornar desde la función que llamó a runAsync. Sin embargo, cuando el hilo se ejecutara, esa función podría haber retornado ya, lo que provocaría un comportamiento indefinido. crossinline lo impide en tiempo de compilación.
Combinación de noinline y crossinline
Una sola función inline puede combinar parámetros normales, noinline y crossinline:
inline fun orchestrate(
crossinline setup: () -> Unit,
action: () -> Unit,
noinline teardown: () -> Unit
) {
Thread { setup() }.start()
action()
register(teardown)
}Error del compilador sin crossinline
Si pasa una lambda insertada inline a un contexto lambda sin crossinline, el compilador muestra: "No se puede insertar 'block' aquí: puede contener retornos no locales. Añada el modificador crossinline."
Uso en la biblioteca estándar
La biblioteca estándar usa crossinline en funciones como Sequence { } y en algunos constructores de coroutines, para garantizar que la lambda proporcionada por el usuario se ejecute de forma segura en un contexto diferente.
noinline no desactiva inline
Marcar un parámetro como noinline no desactiva la inserción inline de toda la función. El cuerpo de la función y todos los demás parámetros lambda se siguen insertando inline. Solo la lambda marcada con noinline conserva su identidad de objeto.
Consideraciones de rendimiento
noinline implica el coste habitual de asignar una lambda para ese parámetro. crossinline sigue insertando la lambda inline; la única restricción es que no permite retornos no locales. Ningún modificador afecta a la inserción inline de los demás parámetros.
Tabla resumen
Resumen de los modificadores:
- Sin modificador → la lambda se inserta completamente inline y se permiten retornos no locales
noinline→ la lambda se conserva como objeto y se puede almacenar o pasarcrossinline→ la lambda se inserta inline y se prohíben los retornos no locales
Comprobación rápida
¿Cuándo debe usar noinline en un parámetro lambda de una función inline?
Resumen: noinline y crossinline
Conclusiones principales:
noinline: conserva una lambda como objeto dentro de una función que, por lo demás, se inserta inlinecrossinline: inserta la lambda inline, pero prohíbe los retornos no locales para permitir un uso seguro entre contextos- Ambos modificadores se aplican por parámetro, no a toda la función
Preguntas frecuentes
¿La lección «Modificadores noinline y crossinline» es gratis?
Sí — el texto completo de «Modificadores noinline y crossinline» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Modificadores noinline y crossinline»?
Controle el comportamiento de inline para parámetros lambda específicos en funciones inline. Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Kotlin Academy?
No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Modificadores noinline y crossinline»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?
Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Funciones inline: eliminar la sobrecarga de las lambdas
- Modificadores noinline y crossinline
- Parámetros de tipo reified: acceder a T en tiempo de ejecución
- Patrones reified prácticos: análisis, DI y serialización