Почему функция-получатель String инициализируется в kotlin - PullRequest
1 голос
/ 21 апреля 2020

Я играл с Kotlin Recivers, пока я не застрял с этим блоком кода

Предположим, это допустимо

 var greet: String.() -> Unit = {
        println("Hello $this")
    }
  • String - это получатель

  • () -> Единица - это тип функции

И мы можем вызвать его в эта форма, которая достаточно ясна для меня

  "my extintion  text".greet()  //--> prints "Hello extintion  text"

Но с этим подходом я не могу понять трюк за инициализацией переменной greet , когда мы не установил никаких параметров и как Kotlin идентифицировал мое переданное значение ("мой текст вымирания") как строку и использовал приветствие для него

greet("also my extintion  text") //--- prints "Hello also extintion text"

1 Ответ

1 голос
/ 21 апреля 2020

Ваша лямбда при декомпиляции показывает следующее:

 public interface Function1<in P1, out R> : Function<R> {
 /** Invokes the function with the specified argument. */
 public operator fun invoke(p1: P1): R
}

А вот так выглядит метод Main:

public final class MainKt {
public static final void main() {
  Function1 greet = (Function1)null.INSTANCE;  //Your 'greet' is of Function1 type which has 'invoke' method.
  greet.invoke("my extintion  text"); //Calling the 'invoke' method of Function1.
}

Компилятор вызывает метод invoke(), передавая Ваша "my extintion text" строка и печатает ее

Трюка нет, компилятор в конечном итоге будет использовать метод передачи invoke() в параметрах, как любой обычный метод.

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