Kotlin对象表达式未按预期工作

时间:2015-04-26 02:19:56

标签: kotlin

我正在GitHub上进行Kotlin练习(见下面的链接)。

我不太了解以下代码。

具体地

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

  2. 如何调用mouseListener?它被调用了4次。我之前没有看到这种语法。如果您能指出文档,那就太棒了。

  3. // this code is on the github and is working
    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
     }
    

    完整源代码为herehere

    提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

您可以在the reference

中找到更多信息

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

答案 1 :(得分:1)

它实际上在Kotlin中被称为类型安全构建器。请参阅此处的详细说明。

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

相关段落我将其剪切并粘贴在

下面
  

......那么,这个电话有什么作用?让我们看一下上面定义的html函数体。它创建了一个新的HTML实例,然后通过调用作为参数传递的函数来初始化它(在我们的示例中,这归结为在HTML实例上调用head和body),然后它返回此实例。这正是建筑师应该做的事情。 ...

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