На каком-то тренинге, который я рассматриваю, я не совсем понимаю, как пример функции высшего порядка и лямбда связаны через синтаксис.
Эта функция Kotlin более высокого порядка
fun myWith(name: String, block: String.() -> Unit) {
name.block()
}
Вызывается так
myWith(fish.name) {
capitalize()
}
Я понимаю, что вторая часть - это лямбда, но я не понимаю, почему она не включена в качестве второго параметра в функцию и просто висит вне параметров. Например, почему он не вызывается как:
myWith(fish.name, { capitalize() } )
Позже более подробное описание примера показано как
myWith(fish.name, object : Function1<String, Unit> {
override fun invoke(name: String) {
name.capitalize()
}
})
Какой IS включает лямбду внутри обычного списка параметров для myWith
В Kotlin существует соглашение, согласно которому, если последний параметр функции принимает функцию, лямбда-выражение, которое передается в качестве соответствующего аргумента, может быть помещено за скобки.
Источник: https://kotlinlang.org/docs/reference/lambdas.html#passing-a-lambda-to-the-last-parameter
Эта ссылка не объясняет, что Зачем это разрешено, то есть AIUI разрешает вызовы функций более высокого порядка, которые выглядят как синтаксис языка. Например, repeat (10) { /*...*/ }
выглядит сравнимо с циклом for
или while
.
@gidds На самом деле это описано всего несколькими строками ниже: kotlinlang.org/docs/reference/…
Я не знаком с LINQ, но я не думаю, что приведенный здесь пример дает такой же сильный пример, как мой :-)
@GenerationTech Это распространенная ранее существовавшая идиома, заимствованная из таких языков, как Ruby и Groovy.
Угу, ок. Кажется произвольным и непоследовательным, но теперь я понял. Спасибо!