Почему с функциями более высокого порядка в Kotlin лямбда-выражения отображаются вне других параметров функции?

На каком-то тренинге, который я рассматриваю, я не совсем понимаю, как пример функции высшего порядка и лямбда связаны через синтаксис.

Эта функция 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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
244
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Kotlin существует соглашение, согласно которому, если последний параметр функции принимает функцию, лямбда-выражение, которое передается в качестве соответствующего аргумента, может быть помещено за скобки.

Источник: https://kotlinlang.org/docs/reference/lambdas.html#passing-a-lambda-to-the-last-parameter

Угу, ок. Кажется произвольным и непоследовательным, но теперь я понял. Спасибо!

GenerationTech 29.05.2019 19:21

Эта ссылка не объясняет, что Зачем это разрешено, то есть AIUI разрешает вызовы функций более высокого порядка, которые выглядят как синтаксис языка. Например, repeat (10) { /*...*/ } выглядит сравнимо с циклом for или while.

gidds 29.05.2019 19:32

@gidds На самом деле это описано всего несколькими строками ниже: kotlinlang.org/docs/reference/…

Diego Magdaleno 29.05.2019 19:51

Я не знаком с LINQ, но я не думаю, что приведенный здесь пример дает такой же сильный пример, как мой :-)

gidds 29.05.2019 20:33

@GenerationTech Это распространенная ранее существовавшая идиома, заимствованная из таких языков, как Ruby и Groovy.

chrylis -cautiouslyoptimistic- 29.05.2019 20:35

Другие вопросы по теме