Ответ 1
Несмотря на визуальное сходство, идея этих двух объявлений совершенно другая.
-
Объявление функции без знака равенства - это
Unit
-returning function (аналогично функциям Javavoid
).Что внутри фигурных скобок - это тело, которое выполняется непосредственно над вызовом функции. Функция может быть переписана с помощью
Unit
явно заданной:fun foo(): Unit { bar() println("baz") return Unit }
Kotlin не требует оператора return и явно возвращаемого типа для
Unit
-отверждающихся функций, и оба они обычно опускаются. -
Объявление функции с символом равенства - это функция однократного выражения, и то, что она делает, просто возвращает то, что справа равно знаку.
Простейший пример:
fun getInt() = 1
- это только более короткая формаfun getInt(): Int { return 1 }
.В
foo
выражение lambda, и оно возвращается только, не выполнено.Тип возврата
foo
есть() -> Unit
, сама функция, и, следовательно,foo
является функцией более высокого порядка.Без синтаксического сахара и с явным типом
foo
можно переписать какfun foo(): () -> Unit { val result: () -> Unit = { bar(); println("baz") } return result }
Что касается использования, функция, возвращаемая
foo
, может быть сохранена в переменной, переданной вокруг, и может быть позже вызвана:val f = foo() f() //equivalent to f.invoke()
Вот почему
foo()()
в примере выполняет код из тела лямбда.