La expresión del object Kotlin no funciona como se esperaba

Estoy pasando por los ejercicios de Kotlin en GitHub (ver enlace a continuación).

No entiendo muy bien el siguiente código.

Específicamente

  1. ¿Dónde se creó el oyente del mouse?

  2. ¿Cómo se invoca mouseListener ? Se invoca 4 veces. No vi esta syntax antes. Sería genial si pudieras señalar la documentation.

 // este código está en el github y está funcionando
 val result = task10 {mouseListener ->
     mouseListener.mouseClicked (mouseEvent)
     mouseListener.mouseClicked (mouseEvent)
     mouseListener.mouseClicked (mouseEvent)
     mouseListener.mouseClicked (mouseEvent)
 }

Estoy pensando que el código debería escribirse como el siguiente. Sin embargo, si corrí, no se desencadena ningún evento.

 // this is not working val result = task10 { mouseListener -> { mouseListener.mouseClicked(mouseEvent) mouseListener.mouseClicked(mouseEvent) mouseListener.mouseClicked(mouseEvent) mouseListener.mouseClicked(mouseEvent) } } 

La statement completa del método es:

 fun task10(handleMouse: (MouseListener) -> Unit): Int { var mouseClicks = 0 handleMouse(todoTask10()) return mouseClicks } 

El código fuente completo está aquí y aquí .

Gracias de antemano.

En la mayoría de los casos, llaves significa la statement lambda (cuando no es parte de otra statement). Es decir, el segundo ejemplo pasa a la task10 lambda, que devuelve lambda.

Puede encontrar más información en la reference

Nota: debería recibir una advertencia sobre el lambda interno de IDE y el comstackdor.

En realidad se llama constructor tipo seguro en Kotlin. Vea la explicación detallada aquí.

http://kotlinlang.org/docs/reference/type-safe-builders.html

El párrafo relevante lo corté y lo pegué debajo

… Entonces, ¿qué hace esta llamada? Miremos el cuerpo de la function html como se definió anteriormente. Crea una nueva instancia de HTML, luego la inicializa llamando a la function que se pasa como argumento (en nuestro ejemplo, esto se networkinguce a llamar a la cabeza y al cuerpo en la instancia de HTML) y luego devuelve esta instancia. Esto es exactamente lo que un constructor debería hacer. …

Eso es exactamente lo que hace en el código que llama a la function task10.

  • Modificador de visibilidad equivalente del package en Kotlin
  • ¿Cómo proporcionar la class kotlin para las configuraciones de ejecución de eclipse?
  • Android w / Kotlin pure-java-Junit NoClassDefFoundError solución no funciona
  • Android 4.x VerifyError causado por el método de Kotlin
  • ¿Cuándo debería usar let {} y cuando simplemente! = Null
  • ¿Es posible usar Kotlin en Grails?
  • ¿Cómo diseñar una class compleja que incluya algunas classs para hacer una expansión fácil en el futuro en Kotlin?
  • Definición de class no encontrada en el código de Kotlin
  • Conjunto de animation, efecto shake
  • delegar la invocación de cierre nested a la class correspondiente
  • El 'Retorno' omitido en Kotlin necesita código adicional. ¿Cómo arreglar eso?