Как использовать литералы функций kotlin?

#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())
}