Kotlin: uso ilegal de devolución de parameters en línea

Estoy convirtiendo mi function tiene lambda como parameter en inline function en inline function para la mejora del performance.

Tengo una list de lambda de tipo MutableList<(Authenticate) -> Unit> variable como miembro de datos en la class. Cuando trato de agregar lambda parameter a la list .

El comstackdor de Kotlin dice:

Uso ilegal de devolución de parameters en línea

Aquí está el código

 // Some code skipped object Odoo { val pendingAuthenticateCallbacks = mutableListOf<(Authenticate) -> Unit>() inline fun authenticate( login: String, password: String, database: String, quick: Boolean = false, crossinline callback: Authenticate.() -> Unit ) { // Following statement has error saying // Illegal usage of inline parameter callback. add 'noinline' modifier to parameter declaration. pendingAuthenticateCallbacks += callback // Error in above statement if (pendingAuthenticateCallbacks.size == 1) { // Retrofit2 Object boxing code skipped val call = request.authenticate(requestBody) call.enqueue(object : Callback<Authenticate> { override fun onFailure(call: Call<Authenticate>, t: Throwable) { (pendingAuthenticateCallbacks.size - 1 downTo 0) .map { pendingAuthenticateCallbacks.removeAt(it) } .forEach { it(Authenticate(httpError = HttpError( Int.MAX_VALUE, t.message!! ))) } } override fun onResponse(call: Call<Authenticate>, response: Response<Authenticate>) { (pendingAuthenticateCallbacks.size - 1 downTo 0) .map { pendingAuthenticateCallbacks.removeAt(it) } .forEach { it(Authenticate(httpError = HttpError( response.code(), response.errorBody()!!.string() ))) } } }) } } } 

Inline inserta el código en el lambda directamente en el sitio de llamada , lo que elimina la sobrecarga de tener un object de function.

Por ejemplo, esto resulta más o less main aquí:

 fun withLambda(lambda: () -> Unit) { lambda() } inline fun inlinedLambda(lambda: () -> Unit) { lambda() } fun main(args: Array<String>) { withLambda { println("Hello, world") } inlinedLambda { println("Hello, world") } } 

siendo convertido a esto:

 fun main(args: Array<String>) { withLambda { println("Hello, world") } println("Hello, world") // <- Directly inserted! } 

Si usted tiene

 pendingAuthenticateCallbacks += callback 

Esto es imposible porque la callback debe ser un object para que se agregue a la list.

Necesita agregar el modificador noinline .

Una aproximación aproximada sería decir que una lambda en línea no se puede tratar como un object, ya que no existe realmente como un object. Se usa directamente en lugar de crearse como un object.

Por supuesto, puedes crear un lambda que contenga:

 pendingAuthenticateCallbacks += { callback() } // Not a good idea 

pero esto derrotaría completamente el punto de incriminación (¡no hagas esto!).

Sin embargo, hacer que el parámetro noinline signifique que su método ahora tiene cero parameters lambda que pueden includese, por lo que también podría eliminar el modificador en inline ya que el beneficio de performance sería mínimo.

El comstackdor debería reconocer esto:

Tenga en count que si una function en línea no tiene parameters de funciones insertables ni parameters de types reificados, el comstackdor emitirá una advertencia, ya que es muy poco probable que la utilización de tales funciones sea beneficiosa.


El motivo principal de los methods de alignment es el performance cuando se utilizan lambdas y para los parameters de tipo genérico reified . A partir de Kotlin 1.1, también es posible tener un acceso de propiedad en línea para properties sin un campo de respaldo.


En resumen, si no tiene parameters lambda (o no tiene parameters de tipo reified , en cuyo caso debe hacerlo ), generalmente no tiene sentido marcar una function como en inline .

  • Kotlin: comparar los valores de propiedad de diferentes objects objective con (fuera) reflexión
  • Kotlin: lambda nunca comstack
  • ¿Cómo escribir lambdas con generics en kotlin?
  • Expresiones de kotlin lambda como parámetro opcional
  • Pasando lambda en lugar de interfaz
  • Funciones de Lambda con comodines en Kotlin
  • Kotlin nombró la syntax del parámetro para el cierre / lambda
  • ¿Cómo pasar arguments a la function lambda anónima en Kotlin?
  • Función anónima asincrónica en Kotlin? (expresiones lambda)
  • Tipo de function de Kotlin en su lugar interfaz funcional lambda
  • Mocktito ArgumentCaptor para Kotlin lambda con arguments