Kotlin обратный вызов немедленного обратного вызова из оператора if - PullRequest
0 голосов
/ 01 октября 2018

Это пахнет смешно из-за двух вызовов startSync ():

override fun onDataChange(dataSnapshot: DataSnapshot) {
    if (null == dataSnapshot.value) {
        aThing.putAll(defaultConfig)
        dbRef.setValue(botState) { _, _ -> startSync() }
    } else {
        startSync()
    }
}

Есть ли дружественный Kotlin способ сказать: «Если X, тогда сделать Y с обратным вызовом Z (), иначе ничего не делать с немедленнымобратный вызов Z () "?Но без необходимости дважды использовать Z ().

Я пришел из JavaScript, где Promise.resolve().then... соответствовал бы требованиям.

1 Ответ

0 голосов
/ 01 октября 2018

Не хотел бы спорить с @yole, ведь он является автором идиом в Kotlin.

Но если вам действительно нравится что-то вроде JavaScript, вы можете сделать что-то вроде этого:

dataSnapshot.value.let {
    if (it == null) {
        ::startSync
    }
    else {
        startSync()
        null
    }
}?.let {
    aThing.putAll(defaultConfig)
    dbRef.setValue(botState) { _, _ ->  it() }
}

Но, как вы можете видеть, он не короче вашей версии и на самом деле гораздо более запутанный.

Иногда, я полагаю, правильный путь - это правильный путь.

Другой способдолжен использовать with и ссылку на метод:

with(::startSync) {
    if (dataSnapshot.value == null) {
        aThing.putAll(defaultConfig)
        dbRef.setValue(botState) { _, _ ->  this() }
    }
    else {
        this()   
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...