如何在父上下文中创建变量

我试图在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}") } } 

现在这个不行,因为after不能解决。 我知道这是由于关闭的方式。

我的问题是,如果Kotlin中有一些机制允许我这样做,可以在闭包/扩展中创建变量,以便将它们存储在接收方对象中,并可供其他闭包/扩展访问。

这是将Groovy脚本迁移到Kotlin的一部分。

免责声明:这是我第一次去Kotlin。 我已经阅读了文档,但我可能会错过(很多)。 随意指向正确的方向

编辑:添加可编辑的例子

 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 } } 

Kotlin是一种静态类型的语言。 无法将数据存储在该对象内没有字段的对象的实例中。

您可以定义Map类型的属性,并将值存储在该映射中,但是除非事先知道哪些值将存储在那里,否则将无法使用常规属性语法访问它们。