Как создать переменные в родительском контексте

Я пытаюсь реализовать что-то похожее на этот синтаксис в 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 и сохранить значения внутри этой карты, но вы не сможете получить к ним доступ с использованием синтаксиса регулярного свойства, если не знаете заранее, какие значения будут там храниться.