无法使用Lambda计算值

时间:2019-11-04 11:40:33

标签: kotlin

请帮助您理解为什么点击价值不会改变。我开始阅读《行动中的科特琳》,现在问题多于答案(这是开玩笑的书,但是我不是)

我试图在功能之前设置clicks,这是《行动中的kotlin》一书中的建议,但是var clicks的值始终为0。

我有以下界面:

interface Button {
    fun onClick(function: () -> Unit)
}

和Kotlin文件

fun main() {
    var clicks = 0

    fun tryToClickOnButton(button: Button): Int{
        button.onClick{println("UPP $clicks")}
        button.onClick{clicks++}
        button.onClick{println("UPP $clicks")}
        return clicks
    }

    class SpecialButton: Button{
        override fun onClick(function: () -> Unit) {
            println("AAAAAA $clicks")
        }
    }

    val button = object: Button {
        override fun onClick(function: () -> Unit) {
            println("BBBBB $clicks")
        }
    }

    println(tryToClickOnButton(button))

    println(tryToClickOnButton(object : Button{
        override fun onClick(function: () -> Unit) {
            println("CCCCCCC $clicks")
        }
    }))

    println(tryToClickOnButton(SpecialButton()))

}

1 个答案:

答案 0 :(得分:1)

问题是您创建了一个带一个函数的回调,但从未调用该函数。

为了使示例更简单,我们删除一些代码:

fun main() {
    var clicks = 0

    fun tryToClickOnButton(button: Button): Int {
        button.onClick { println("UPP $clicks") }
        button.onClick { clicks++ }
        button.onClick { println("UPP $clicks") }
        return clicks
    }

    val button = object : Button {
        override fun onClick(function: () -> Unit) {
            println("BBBBB $clicks")
        }
    }

    println(tryToClickOnButton(button))
}

您可以看到,在Button的{​​{1}}回调中,您接受了名为“ onClick”的“函数”类型的参数,但从未使用过。因此,您永远不会打印“ UPP $ {clicks}”,也永远不会增加function的值。

要解决此问题,您只需要像这样调用clicks

function

该代码显示:

fun main() {
    var clicks = 0

    fun tryToClickOnButton(button: Button): Int {
        button.onClick { println("UPP $clicks") }
        button.onClick { clicks++ }
        button.onClick { println("UPP $clicks") }
        return clicks
    }

    val button = object : Button {
        override fun onClick(function: () -> Unit) {
            println("BBBBB $clicks")
            function() // this was missing
        }
    }

    println(tryToClickOnButton(button))
}