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.

  • Aplicación Kotlin con plugin de aplicación Gradle
  • kotlin-android null no se puede convertir a tipo no nulo kotlin.String
  • ¿Puedo hacer reference a una sobrecarga de function específica?
  • ¿Es posible devolver el mismo tipo que el parámetro de tipo en la instrucción when
  • ¿Cómo establecer el margen inferior a FAB en el layout Anko DSL?
  • Anotación de Android Studio StyleRes da advertencia sobre Kotlin var
  • Crear un caching de ehcache en Kotlin
  • El valor de retorno de las funciones de Kotlin se guarda en firebase
  • especifique la class Kotlin como el punto de input de la class principal en MANIFEST.MF?
  • Android: raspando artículos con jsoup
  • Seguridad nula en las bibliotecas henetworkingadas de Java utilizadas en los proyectos de Kotlin