0

我正在尝试在 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无法在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
    }
}
4

1 回答 1

1

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

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

于 2016-05-31T20:54:12.670 回答