Объявление функции Kotlin: знак равенства перед фигурными скобками

В Kotlin синтаксис объявления функции позволяет вам писать знак равенства перед фигурными фигурными скобками. Рассмотрим два примера:

  1. Без = знак:

     fun foo() { bar() println("baz") } 

    Код внутри тела выполняется, просто вызывая foo() .

  2. With = sign:

     fun foo() = { bar() println("baz") } 

    Здесь, когда вызывается foo() , ничего не происходит, но чтобы получить выполненное тело, можно написать foo()() .

В чем разница в этих двух декларациях и почему они ведут себя по-другому?


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

Несмотря на визуальное сходство, идея этих двух деклараций совершенно иная.

  1. Объявление функции без знака равенства – это функция Unit refurning (аналогичная функции void Java).

    То, что находится внутри фигурных скобок, – это тело, которое выполняется непосредственно на вызове функции. Функция может быть переписана с явно заданной Unit :

     fun foo(): Unit { bar() println("baz") return Unit } 

    Kotlin не требует выражения return и явного типа возврата для функций Unit refurning, и оба они обычно опускаются.

  2. Объявление функции с символом равенства – это функция с одним выражением , и то, что она делает, просто возвращает то, что справа от знака равенства.

    fun getInt() = 1 пример: fun getInt() = 1 – это всего лишь более короткая форма fun getInt(): Int { return 1 } .

    В foo выражение является лямбда , и оно возвращается только, а не выполняется .

    Тип возврата foo is () -> Unit , сама функция, и, таким образом, foo является функцией более высокого порядка .

    Без синтаксического сахара и с явным типом foo можно переписать как

     fun foo(): () -> Unit { val result: () -> Unit = { bar(); println("baz") } return result } 

    Что касается использования, функция, которая возвращает foo может храниться в переменной, передаваться и позже может быть вызвана :

     val f = foo() f() //equivalent to f.invoke() 

    Вот почему foo()() в примере выполняет код из тела лямбды.

Intereting Posts
Соответствие регулярных выражений в строке Как удалить элементы из MutableList в Котлине Ожидаемый однобоковый бит, но найден 3: objectMapper, halObjectMapper, _halObjectMapper в junitTest передача var-args в MessageFormat.format в kotlin Сравнение сетевых библиотек Android: OkHTTP, Retrofit и Volley Kotlin Date.daysПосле использования другого возвращаемого значения с теми же аргументами Исходный класс в Котлине Как я могу превратить KFunction без экземпляра param в KFunction с ним? Могу ли я создать метод расширения Kotlin для добавления rxJava-подписки на композитную подписку? Использование данных Amazon AWS Cognito `. Well-known / jwks.json` не позволяет base64 декодировать некоторые поля Исключение Java / Kotlin для шаблона посетителя с типичным типом возврата Как работает пример простых чисел из документации Kotlin Coroutines? Почему == и равные производят разные результаты? Эквивалент текста для ImageView Заполнение строки с помощью Firestore