#kotlin
#kotlin
Вопрос:
Итак, у меня здесь есть литерал функции:
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.
val listOfBooleans = task()
?2. Для ясности: у вас есть два литерала функций внутри обычной функции. Обычная функция может быть вызвана, как указано в @JBNizet. AFAIK, вы не можете получить доступ к литералам функций извне функции.
3. Вы не можете получить доступ к isEven или isOdd вне task(). Это называется scope.
4. ваш вопрос сводится к «какова цель определения области видимости». Конкретный элемент, к которому он применяется, на самом деле не имеет значения. Если вы хотите получить к ним доступ за пределами области действия task(), вы определяете их вне нее.
5. «Какой здесь практический вариант использования?» -> Это избавляет вас от необходимости писать
42 % 2 != 0
. Вместо этого некоторым людям может показаться42.isOdd()
немного более понятным.
Ответ №1:
Когда вы определяете литералы функций внутри функции, они доступны только в области этой функции:
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())
}