Как привязать метод к имени в Котлине?

avatar
Alex M.
1 июля 2021 в 18:27
38
1
0

В Kotlin фрагмент кода val f = println() связывает функцию println (которая является объектом первого класса) с именем f.

Как сделать то же самое с методом map, т.е. сохранить его в f?

Синтаксис val f = map не работает, равно как и val f = arrayOf(1,2,3).map. Я пробовал различные варианты описанного выше, но безуспешно.

Также (и связанное с этим), почему val f = println не работает, что делает скобки необходимыми? Я пришел из лагеря функционального программирования (Scheme), где это было бы абсолютно нормально.

(Отказ от ответственности: абсолютный новичок в Kotlin, пытаюсь изучить его самостоятельно.)

Источник

Ответы (1)

avatar
Tenfour04
1 июля 2021 в 18:50
4

В Kotlin фрагмент кода val f = println() связывает функцию println (которая является объектом первого класса) с именем f.

Неправда. Это присваивает возвращаемое значение результата вызова println(), т.е. Unit, переменной f. Чтобы получить ссылку на функцию, используйте ::. Но вы также должны указать тип переменной, потому что он не может быть выведен, когда функция имеет перегрузки:

val f: (Any)->Unit = ::println

Функция с получателем должна быть указана с использованием типа приема, например

val f = Any::toString

// or, to bind a specific instance's toString:
val myList = listOf("Hello", "World")
val myListToString = myList::toString

Поскольку map является функцией высшего порядка, она имеет длинную и сложную сигнатуру:

val f: Array<Int>.((Int)->String)->List<String> = Array<Int>::map