Я пытаюсь реализовать что-то похожее на этот синтаксис в Kotlin
class MyClass() { fun before(init: () -> Unit): Unit { with(this) init } fun after(block: () -> Unit): Unit { with(this) block } } fun main () { var myClass = MyClass() myClass.before { var a = 5 } myClass.after { println("Double of a is ${a * 2}") } }
Сейчас это не сработает, потому что a
этого невозможно решить. Я понимаю, что это связано с тем, как работают замыкания.
Мой вопрос в том, что в Котлине есть какой-то механизм, который позволил бы мне это сделать, создавать переменные в замыкании / расширении таким образом, чтобы они были сохранены в объекте-получателе и были доступны для других закрытий / расширений.
Это часть усилий по переносу сценария Groovy на Kotlin.
Отказ от ответственности: Это мой первый визит в Котлин. Я прочитал документы, но, возможно, мне что-то не хватает (много). Не стесняйтесь просто указывать в правильном направлении
EDIT: добавление компилируемого примера
class Aa() { var a: Int = 0 var bb: () -> Unit = null!! fun ww (block: () -> Unit) { bb = block } fun doit(block: () -> Unit) { with(bb) { block() } } } fun main(args: Array<String>) { val exec = fun Aa.(other: () -> Unit): Unit = other() aa.ww { var xx = 5 } aa.doit { // println("with $xx") <- this fails } }
Котлин – статически типизированный язык. Невозможно хранить данные внутри экземпляра объекта, для которого нет поля внутри этого объекта.
Вы можете определить свойство типа Map
и сохранить значения внутри этой карты, но вы не сможете получить к ним доступ с использованием синтаксиса регулярного свойства, если не знаете заранее, какие значения будут там храниться.