Может ли кто-нибудь объяснить мне, пожалуйста, реализацию следующей «функции высокого порядка Kotlin Literal»? - PullRequest
0 голосов
/ 21 июня 2019

Я новичок в Kotlin, я только начал изучать его, я получаю следующий пример кода о функции литерала / высокого порядка:

fun myHigherOrderFun(functionArg: (Int)->String) = functionArg(5)
println ( myHigherOrderFun { "The Number is $it" })
prints "The Number is 5"

Что мне трудно понять: функция myHigherOrderFun getлямбда-функция в качестве параметра, но я не могу понять, где входной параметр (Int)?Я вижу, передается в functionArg (5) ... но я не могу понять, как это возможно?

Заранее спасибо.

1 Ответ

0 голосов
/ 21 июня 2019

Для начала, в Kotlin функции являются первоклассными типами, такими же, как числа, строки и прочее.Таким образом, функция может принимать другую функцию в качестве параметра и / или возвращать функцию в качестве результата.Функция, которая делает это, называется «функцией высшего порядка».

И это то, что вы имеете в своем примере!Строка:

fun myHigherOrderFun(functionArg: (Int)->String) = functionArg(5)

определяет myHigherOrderFun() как функцию, которая принимает один параметр, которая сама является функцией, принимающей один параметр Int и возвращающей String.(myHigherOrderFun() не указывает явный тип возвращаемого значения, поэтому предполагается, что он также String.)

Вероятно, следующая строка будет менее ясной:

println(myHigherOrderFun{ "The Number is $it" })

Первая неочевидная вещь заключается в том, что он вызывает myHigherOrderFun() с параметром.Поскольку этот параметр является лямбда-выражением, Kotlin позволяет вам опустить обычный () и использовать только фигурные скобки.

Другая неочевидная вещь - это сама лямбда: { "The Number is $it" }.Это буквенная функция, принимающая один параметр (неопределенного типа).

Обычно вам нужно явно указывать любые параметры, например: { a: Char, b: Int -> /* … */ }.Но если есть ровно один параметр, и вы не указываете его тип, вы можете пропустить его и просто обратиться к параметру как it.Вот что здесь происходит.

(Если бы лямбда не ссылалась на it, то это была бы функция, не принимающая никаких параметров вообще.)

И поскольку лямбда передается вчто-то ожидающее функцию, принимающую параметр Int, Котлин знает, что it должно быть Int, поэтому мы можем обойтись без указания этого.

Итак, Котлин передает эту лямбду в myHigherOrderFun(), который выполняет лямбду, передавая 5 как it.Это интерполирует его в строку, которую он возвращает в качестве аргумента println().

Многие лямбда-выражения принимают один параметр, поэтому it довольно часто используется в Kotlin;это более кратко (и обычно более читабельно), чем альтернатива.См. документы для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...