Kotlin对象expression式没有按预期工作

我正在通过GitHub上的Kotlin练习(请参阅下面的链接)。

我不太了解下面的代码。

特别

  1. 鼠标侦听器在哪里创建?

  2. mouseListener如何被调用? 它被调用4次。 我以前没有看到这个语法。 如果你能指出文档,那将是非常好的。

 / /这个代码是在github上,正在工作
 val result = task10 {mouseListener  - >
     mouseListener.mouseClicked(MouseEvent)方法
     mouseListener.mouseClicked(MouseEvent)方法
     mouseListener.mouseClicked(MouseEvent)方法
     mouseListener.mouseClicked(MouseEvent)方法
 }

我在想代码应该写成如下所示。 但是,如果我跑了,没有事件被触发。

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

该方法的完整声明是:

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

完整的源代码在这里和这里 。

先谢谢你。

在大多数情况下,花括号表示lambda声明(当它不是其他声明的一部分时)。 即第二个例子传递给返回lambda的task10 lambda。

您可以在参考资料中find更多信息

注意:你应该从IDE和编译器得到内部lambda的警告。

它实际上在Kotlin被称为types安全建造者。 在这里看到详细的解释。

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

相关的段落我剪切并粘贴在下面

那么,这个电话是做什么的? 让我们看看上面定义的html函数的主体。 它创建一个新的HTML实例,然后通过调用作为parameter passing的函数来初始化它(在我们的例子中,这归结为调用HTML实例的head和body),然后返回这个实例。 这正是建筑商应该做的。 …

这正是它在调用task10函数的代码中所做的。