Я пытаюсь ознакомиться с более совершенными функциями 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: незаметные локальные функции, лямбды и анонимные функции еще не полностью поддерживаются в отражении Котлина