En objects receptores Kotlin y extensiones

Estoy tratando de familiarizarme con las funciones más avanzadas de kotlin, pero no sé por qué mi pequeño código de ejemplo comstack e imprime "Prueba A" sin imprimir "Prueba B". ¿Alguien puede decirme por qué la Prueba B no está impresa?

class One{ fun delegate(operation: One.()-> Unit){ operation() } fun main(args: Array<String>){ val one= One() fun One.doIt(){ println("Test A") } one.delegate { doIt() } //prints Test A one.delegate { fun One.doItDifferently(){ println("Test B") //not printed } } } 

Esto se debe a que no llama a la function .toItDifferently() , solo la define (es una function local , es decir, una function definida dentro de otra function). Modifique su ejemplo para llamar a la function:

 one.delegate { fun One.doItDifferently(){ println("Test B") } doItDifferently() // <- here } 

(UPD, basado en el comentario) Puede llamar a un delegate con una function anónima como esta:

 one.delegate( // note the parenthesis, not the curly braces fun One.(){ println("Test B") } ) 

Esta statement

 one.delegate { fun One.doItDifferently(){ println("Test B") //not printed } } 

simplemente creará una function vacía con una function anidada. doItDifferently() se acaba de declarar, pero nunca se invoca. Por lo tanto, println("Test B") nunca se ejecutará.

No estás llamando a la function.

Esa es una function de extensión local en la class One y solo la está declarando. Ahora existe y se puede utilizar en el ámbito actual, pero no hace nada por sí mismo.

Debería llamarlo / invocarlo para que haga cualquier cosa, como con cualquier método normal:

  one.delegate {
     diversión One.doItDifferently () {
         println ("Prueba B")
     }

     doItDifferently ()
 } 

IntelliJ en realidad le dará una advertencia de que esta function nunca se usa.

Editar: según su comentario, no está pasando la function en absoluto. Esto aún no es posible si desea devolver la function ya que el reflection no admite funciones locales.

Si intentas esto:

  class uno {
     delegado divertido (operación: One. () -> KFunction <*>) {
         operación (). llamada (esto)
     }
 }

 divertido main (args: Array) {
     val one = One ()
     diversión One.doIt () {
         println ("Prueba A")
     }
     one.delegate {
         diversión One.doItDifferently () {
             println ("Prueba B") // no impreso
         }
         esto :: doItDifferently
     }
 } 

Obtendrás:

Excepción en el hilo "principal" kotlin.reflect.jvm.internal.KotlinReflectionInternalError: la introspección de funciones locales, lambdas y funciones anónimas aún no se admite por completo en la reflexión de Kotlin

  • ¿Cómo hacer reference a la class interna anónima en Kotlin?
  • ¿Cómo convierto un Int en una cadena en Kotlin?
  • window.reload en Webview
  • Cargue la configuration xml del muelle de forma dinámica
  • El soporte JUnit experimental en Android + Kotlin no funciona
  • ¿Cómo especifico que un campo encuadrado puede ser anulable en mi código de migration de Realm?
  • ¿Cómo llamar al método ArrayAdapter.addAll en Kotlin?
  • ¿Es posible especificar una function estática en una interfaz de Kotlin?
  • Kotlin crea un resultado de consulta para analizar repositorys de Github
  • acceso al método de extensión kotlin en otro kt
  • Mapa de Mybatis COALESCE (int, 0) a java.lang.Long