Kotlin: что означает аннотация (a cc: S, T) -> S? - PullRequest
0 голосов
/ 14 февраля 2020

Я очень новичок в Kotlin. Я посмотрел на исходный код Kotlin и увидел этот прототип:

public inline fun <S, T : S> Iterable<T>.reduce(operation: (acc: S, T) -> S): S 

Я понимаю, что операция - это метод, a cc - это один из ее аргументов, 'a cc' имеет тип S, а возвращаемое значение операции имеет тип S. Однако что означает T внутри списка аргументов? Где его аргументы?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Именование параметров функции в типе функции необязательно. Имена имеют значение только для целей документирования.

То, что сказано выше, говорит о том, что reduce ожидает, что функция принимает S (накопленное значение) и T (текущий элемент). Они дали S имя acc, но не дали T никакого имени.

0 голосов
/ 14 февраля 2020

(acc: S, T) -> S является типом.

В Kotlin, функции являются первоклассными типами . У некоторых типов есть простое имя, например String или Int. Другим нужны параметры, такие как List<URL> или Map<Int, String>. Типы функций имеют еще более сложные имена в виде:

( params ) -> returnType

Итак, функция, которая принимает Одиночный параметр Int и возвращает String будет иметь тип (Int) -> String.

Вы также можете дать имена параметров, если хотите, например, (count: Int) -> String, хотя имя игнорируется.

Итак, в вашем примере метод reduce() принимает один параметр, который называется operation. Этот параметр является функцией, которая сама принимает два параметра (первый с именем acc типа S и второй с типом T без имени) и возвращает значение типа S.

В вашем случае особенно запутанно то, что S и T являются параметрами типа: они относятся к типам, которые еще не известны. Когда вызывается метод reduce(), вызывающая сторона указывает их (или компилятор выводит их). Вот что означает <S, T : S> после fun: для метода нужны два параметра типа: S и T (который должен быть S или подтип).

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