Как сделать и использовать массив функций - PullRequest
0 голосов
/ 08 ноября 2018

Как я могу создать массив функций и легко вызывать каждую функцию? Я уже пытался сделать ArrayList<Function<Unit>>, но когда я попытался сделать это:

functionList.forEach { it }

и это:

for(i in 0 until functionList.size) functionList[i]

Когда я попытался сделать это: it() и это: functionList[i](), но он даже не скомпилируется в intellij. Как я могу сделать это в kotlin? Кроме того, "Единица" в ArrayList<Function<Unit>> означает возвращаемое значение или параметры?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Я думаю, что здесь есть две проблемы с использованием интерфейса Function.

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

Function имеет несколько подчиненных интерфейсов, по одному для каждой «арности» (т. Е. По одному для каждого числа параметров): Function0 для функций, которые не принимают параметров, Function1 для функций, принимающих один параметр, и т. Д. , Эти имеют соответствующие invoke() методы. Таким образом, вы могли бы исправить это, заменив Function на Function0.

Но это подводит меня ко второй проблеме, которая заключается в том, что интерфейсы функций не должны использоваться таким образом. Я думаю, что они в основном для совместимости с Java и / или для внутреннего использования компилятором.

Обычно гораздо лучше использовать синтаксис Kotlin для типов функций: (P1, P2...) -> R. Это намного проще для чтения и позволяет избежать подобных проблем.

Таким образом, реальный ответ, вероятно, заключается в замене Function<Unit> на () -> Unit.

Также, если неясно, у Kotlin нет типа void. Вместо этого он имеет тип Unit, который имеет ровно одно значение. Это может показаться странным, но имеет смысл в системе типов, поскольку позволяет компилятору отличать функции, которые возвращают без явного значения, от функций, которые не возвращают. (Последние могут всегда генерировать исключение или выходить из процесса. Их можно определить так, чтобы они возвращали Nothing - тип без значений вообще.)

0 голосов
/ 08 ноября 2018

Так же, как это:

val funs:List<() -> Unit> = listOf({}, { println("fun")})
funs.forEach { it() }

Компилятор может успешно определить тип funs, который равен List<() -> Unit>. Обратите внимание, что () -> Unit - это тип функции в Kotlin, который представляет функцию, которая не принимает аргументов и возвращает Unit.

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