Не могу посчитать значение с лямбда - PullRequest
0 голосов
/ 04 ноября 2019

Пожалуйста, помогите понять, почему значение кликов не меняется. Я начал читать «Kotlin в действии», и теперь у меня больше вопросов, чем ответов (книга-шутка - это здорово, но я нет)

Я пытался установить clicks перед функцией, это был совет из книги »kotlin in action ", но значение 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 Ответ

1 голос
/ 04 ноября 2019

Проблема в том, что вы создали обратный вызов, который принимает функцию, но вы никогда не вызываете эту функцию.

Давайте удалим некоторый код, чтобы упростить пример:

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 s onClick вы принимаете аргумент под названием functionтипа «функция», но вы никогда не используете его. По этой причине вы никогда не будете печатать «UPP $ {клики}» и никогда не будете увеличивать значение 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))
}

Этот код печатает:

BBBBB 0
UPP 0
BBBBB 0
BBBBB 1
UPP 1
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...