Объект и расширения приемника Kotlin

Я пытаюсь ознакомиться с более совершенными функциями kotlin, но я не знаю, почему мой маленький пример кода компилирует и печатает «Test A», не печатая «Test B». Может ли кто-нибудь сказать мне, почему тест B не печатается?

class One{ fun delegate(operation: One.()-> Unit){ operation() } fun main(args: Array<String>){ val one= One() fun One.doIt(){ println("Test A") } one.delegate { doIt() } //prints Test A one.delegate { fun One.doItDifferently(){ println("Test B") //not printed } } } 

Это потому, что вы не вызываете функцию .toItDifferently() , вы определяете ее только (это локальная функция , то есть функция, определенная внутри другой функции). Измените свой пример, чтобы вызвать функцию:

 one.delegate { fun One.doItDifferently(){ println("Test B") } doItDifferently() // <- here } 

(UPD, на основе комментария). Вы можете вызвать delegate с анонимной функцией следующим образом:

 one.delegate( // note the parenthesis, not the curly braces fun One.(){ println("Test B") } ) 

Это заявление

 one.delegate { fun One.doItDifferently(){ println("Test B") //not printed } } 

просто создаст пустую функцию с вложенной функцией. doItDifferently() только что объявлено, но никогда не вызывается. Следовательно, println("Test B") никогда не будет выполнен.

Вы не вызываете функцию.

Это локальная функция расширения класса One и вы просто объявляете ее. Он теперь существует и может использоваться в текущем объеме, но сам по себе ничего не делает.

Вам нужно будет вызвать / вызвать его для него, чтобы что-либо сделать, как с любым обычным способом:

  one.delegate {
     fun One.doItDifferently () {
         println («Тест B»)
     }

     doItDifferently ()
 } 

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

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

Если вы попробуете это:

  class One {
     веселый делегат (операция: один. () -> KFunction <*>) {
         Операция (). вызова (это)
     }
 }

 fun main (args: Array) {
     val one = One ()
     fun One.doIt () {
         println ("Тест A")
     }
     one.delegate {
         fun One.doItDifferently () {
             println («Тест B») // не печатается
         }
         это :: doItDifferently
     }
 } 

Ты получишь:

Исключение в потоке «main» kotlin.reflect.jvm.internal.KotlinReflectionInternalError: незаметные локальные функции, лямбды и анонимные функции еще не полностью поддерживаются в отражении Котлина

Intereting Posts
Android kotlin: невозможно прочитать файл класса Синтаксис Carat в интерфейсах Kotlin Обновить активность при нажатии в RecyclerView Выполнение не выполнено для задачи «app: copyDebugAndroidTestKotlinClasses» – Android Kotlin Build Error Ошибка автоматической настройки плагина kotlin-gradle Android Studio (Kotlin) как преобразовать StringArray в MutableList Ссылка на представления с одним и тем же идентификатором в разных макетах с расширением android kotlin Строительство проектов Kotlin с Gradle иногда не получается с NoClassDefFoundError Обработка Nullable Type в RxJava с Kotlin Как умножить nullsafe float в котлин? Как использовать дженерики в сопутствующем объекте Как вызвать конструктор String Java (char , int offset, int length) из Kotlin? Как добавить репозиторий maven по URL-адресу, используя kotlinscript DSL (build.gradle.kts) Преимущества LINQ над функциональными цепочками методов Инструментальные тесты не могут выполняться в библиотечных модулях Android с файлами Kotlin