Как эффективно читать / интерпретировать этот код Kotlin? - PullRequest
0 голосов
/ 01 февраля 2019

Я знаю, как читать / интерпретировать код Java, и я могу написать его.Однако, будучи новичком в kotlin, я нахожу код, подобный приведенному ниже, трудным для чтения.Возможно, мне не хватает ключевых понятий в языке.

Но как бы вы интерпретировали этот код?Где вы предлагаете начать его чтение, чтобы быстро и эффективно понять этот фрагмент кода?Слева направо?Справа налево?Сначала разбить параметры?Посмотрите на возвращаемые значения?

inline fun <T : Any, R> ifNotNull(input: T?, callback: (T) -> R): R? {
    return input?.let(callback)
}

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Ответ Мэтта объясняет все хорошо за один раз;Я попытаюсь взглянуть на как вы могли бы читать такой код.

Пока пропускаем первое слово, самое важное - второе слово: fun.Так что все это определяет функцию .Это говорит вам, что ожидать от остальных.

Скобки говорят вам, что это блочная функция, а не однострочная, поэтому вы ожидаете, что базовая структура: fun name(params): returnType { code }.Остальное заполняет пробелы!(Это соответствует общему шаблону объявлений Kotlin, где тип идет вторым после двоеточия. Эквивалент Java, конечно, будет больше похож на returnType name(params) { code }.)

Как и в Java, содержимое в угловых скобкахдавая общие параметры, поэтому мы можем пока пропустить это и перейти прямо к следующему наиболее важному биту, который является именем определяемой функции : ifNotNull.

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

<T : Any, R> дает универсальных типов параметров , которые использует функция.Первый - T, который должен быть Any или подтипом;второй - R, что не ограничено.

(Any похоже на Java Object, но не может быть null; самый верхний тип - связанный Any?, который также позволяетnull. Так что, за исключением Nullability, это эквивалентно Java <T extends Object, R>.)

В дальнейшем у нас есть параметры функции в скобках.Опять же, их два: первый называется input, и он имеет тип T?, что означает, что он принимает любое значение типа T, а также принимает null.Второй параметр называется callback и имеет более сложный тип, (T) -> R: это функция, которая принимает T в качестве своего параметра и возвращает R.(Java не имеет типов функций как таковых, так что, вероятно, выглядит странно. Ближайший эквивалент Java равен Function<R, T>.)

После скобок возвращается возвращаемый тип самой этой функции,R?, что означает, что он может вернуть либо R, либо null.

Наконец, в фигурных скобках указан фактический код функции.Это имеет одну строку, которая возвращает значение выражения.(Его эффект заключается в проверке, является ли значение input равным null: если это так, он возвращает null напрямую. В противном случае он вызывает функцию callback, заданную в параметре, передавая input в качестве параметра, и возвращает свой результат.)

Хотя это короткое объявление, оно довольно абстрактное и содержит много информации, поэтому неудивительно, что вы находите его сложным!(Формат подобен объявлению метода Java - но Kotlin довольно выразителен, поэтому эквивалентный код имеет тенденцию быть немного короче, чем Java. И дженерики делают его более сложным.) Если вы только начинаете изучать Kotlin, япредложил бы кое-что немного проще: -)

(Хорошая новость заключается в том, что, как и в Java, вам не нужно часто читать код stdlib. Хотя комментарии к документации Kotlin редко достигают примерного уровняJava, они все еще обычно достаточно.)

0 голосов
/ 01 февраля 2019

Давайте разберем определение функции по частям:

inline: Указывает, что код функции будет скопирован непосредственно на сайт вызова, а не вызываться как обычная функция.

fun: мы определяем функцию.

<T : Any, R>: функция принимает два параметра универсального типа, T и R.Тип T ограничен типом Any (который является типом Object Котлина).Это может показаться излишним, но на самом деле он говорит о том, что T не может иметь тип NULL (Any?).

ifNotNull: имя функции.

input: T?: Первый параметр типа T?.Мы можем поместить ? в тип T здесь, потому что мы ограничили его необнуляемыми типами в объявлении типа.

callback: (T) -> R: Второй параметр имеет тип (T) -> R, которыйтип функции.Это тип функции, который принимает T в качестве входных данных и возвращает R.

: R?: функция возвращает значение типа R или null.

return input?.let(callback): тело функции.Функция let принимает параметр функции, вызывает его у получателя (input), а затем возвращает результат функции.? после input говорит, что let будет вызываться, только если input не равно нулю.Если input равно нулю, то выражение будет возвращать ноль.

Функция эквивалентна этому методу Java (за исключением встроенного и обнуляемого типов):

public <T, R> R ifNotNull(final T input, final Function<T, R> callback) {
    if (input == null) {
        return null;
    }

    return callback.apply(input);
}
0 голосов
/ 01 февраля 2019

Итак, как и Java, это универсальная функция.Он имеет два параметра типа T, который имеет тип «Any» («Any» похож на «Object» в Java) и R. Входной параметр имеет значение N, допускающее значение NULL, что обозначено знаком вопроса.Обнуляемые типы означают, что значение может быть нулевым.Другой параметр функции - это функция, которая принимает T (не обнуляемый тип) и возвращает R. Возвращаемый тип функции - обнуляемый R. Тело функции говорит, что если input не равен null, вызовите и передайте егообратный вызов и вернуть это значение.Если input имеет значение null, то возвращается null.

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