Как использовать литералы функции kotlin? - PullRequest
0 голосов
/ 12 марта 2019

Итак, у меня есть здесь литерал функции:

fun task(): List<Boolean> {
    val isEven: Int.() -> Boolean = { this % 2 == 0 }
    val isOdd: Int.() -> Boolean = { this % 2 != 0 }

    return listOf(42.isOdd(), 239.isOdd(), 294823098.isEven())
}

, и я точно понимаю, как она работает внутри функции - но как она используется вне функции?Как называется task()?(практический пример предпочтительно)

1 Ответ

3 голосов
/ 12 марта 2019

Когда вы определяете функциональные литералы внутри функции, они доступны только в области действия этой функции:

fun task(): List<Boolean> {
    val isEven: Int.() -> Boolean = { this % 2 == 0 } // unavailable outside the `task` function
    val isOdd: Int.() -> Boolean = { this % 2 != 0 }  // unavailable outside the `task` function

    return listOf(42.isOdd(), 239.isOdd(), 294823098.isEven())
}

Если вы хотите получить доступ к этим функциональным литералам вне функции, вам нужно переместить их за пределы task функция:

val isEven: Int.() -> Boolean = { this % 2 == 0 }
val isOdd: Int.() -> Boolean = { this % 2 != 0 }

fun task(): List<Boolean> {
    return listOf(42.isOdd(), 239.isOdd(), 294823098.isEven())
}

fun anotherTask(): List<Boolean> {
    return listOf(2.isOdd(), 23.isOdd(), 2948.isEven())
}

ИЛИ

Вместо использования функциональных литералов вы можете создавать функции расширения:

fun Int.isEven(): Boolean { return this % 2 == 0 }
fun Int.isOdd(): Boolean { return this % 2 != 0 }

fun task(): List<Boolean> {
    return listOf(42.isOdd(), 239.isOdd(), 294823098.isEven())
}

fun anotehrTtask(): List<Boolean> {
    return listOf(2.isOdd(), 23.isOdd(), 2948.isEven())
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...