Когда я использую другую функцию без параметров в Kotlin? - PullRequest
0 голосов
/ 31 марта 2020

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

enter image description here

Q1) Почему я могу использовать 2 типа? (с параметрами и без параметров) Это функция Kotlin? Q2) Что это значит? ((Результат!) -> Единица)!

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Кажется, вы запутались, вы никогда не можете использовать функцию без аргументов. Если функция имеет аргументы, вы должны как-то заполнить слот.

Самое близкое, что может иметь отношение к тому, на что вы ссылаетесь, это значения по умолчанию для аргументов.

fun example(boolean: Boolean = true) {}

example()

example(true)

example(false)

Вы можете опустить аргумент, потому что он по умолчанию задан в сигнатуре функции.

Документация

В файле изображения вы видите лямбду.

В первый пример:

signIn(listener: Session...)

Это похоже на обратный вызов. Так что это будет интерфейс или, может быть, абстрактный класс, вызываемый, когда завершается некоторая операция asyn c.

Второй пример, это обратный вызов, реализованный в виде лямбды

signIn() { result ->
   //do something
}

В Kotlin последний аргумент, если это лямбда или что-то, что может быть реализовано как лямбда, можно убрать из скобок для syntacti c sugar. Лямбда похожа на анонимную функцию, она является литералом функции.

Например, вы можете объявить лямбду:

val lambda = {text: String -> text.lenght % 2 == 0}

fun setRuleForText(rule: (String)-> Boolean) {...}

setRuleForText(lambda)

setRuleForText() { text: String 
    text.isNotEmpty()
}

В этом случае аргумент равен kotlin функция. Аргумент rule является функцией, которая получает String в качестве аргумента и возвращает Boolean. Следует отметить, что выражения возвращают последнее записанное значение без необходимости в зарезервированном return слове.

Это документация . И здесь из хорошего источника вы можете узнать больше о функциях (автор Kotlin сертифицирован, обучен Jetbrains)

В вашем случае (Result) -> Unit означает, что лямбда должна получить Result введите в качестве аргумента и затем верните Unit (единица похожа на void в Java, но больше), нет явного возвращаемого типа.

signIn() { result ->
  //do something
}

Большинство типов аргументов в лямбдах выводится автоматически, но если нет, то

signIn() { result: Result ->
  //do something
}
0 голосов
/ 31 марта 2020

Обе из перечисленных функций принимают параметры.

Первая:

signIn(listener: Session.SignInListener!)

, которая принимает один параметр типа Session.SignInListener. (! означает, что Kotlin не знает, является ли он обнуляемым или нет, потому что он из Java и не аннотирован.)

Другой:

signIn {...} (listener: ((Result!) -> Unit)!)

Это представление функции в IDE с такой сигнатурой:

signIn(listener: ((Result!) -> Unit)!)

Это принимает один параметр, который является типом функции (см. Ниже).

Причина, по которой IDE показывает это с фигурными скобками является то, что в Kotlin, если последний параметр функции является лямбда-выражением, вы можете переместить его за скобки. Таким образом, такой вызов:

signIn({ println(it) })

может быть одинаково хорошо написан так:

signIn() { println(it) }

Эти две формы означают абсолютно одно и то же. И, кроме того, если лямбда является параметром only , вы можете полностью опустить парены:

signIn { println(it) }

Опять же, это означает то же самое.

То синтаксис позволяет вам писать функции, которые выглядят как синтаксис нового языка. Например:

repeat (10) {
    // ...
}

выглядит как новая форма конструкции l oop, но на самом деле это просто функция с именем repeat, которая принимает два параметра (целое число и лямбда).

ОК, давайте посмотрим на этот тип функции: ((Result!) -> Unit)!

Это тип функции, которая принимает один параметр типа Result и возвращает Unit (т.е. ничего полезного; подумайте о это как эквивалент void). Опять же, это сложно, потому что Kotlin не знает об обнуляемости; и параметр Result, и параметр, содержащий эту функцию, имеют ! с, чтобы указывать это. (Без них это было бы просто (Result) -> Unit.)

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