如何在父上下文中创建变量
How to create variables on parent context
我正在尝试在 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 中是否有某种机制允许我这样做,在 closure/extension 中创建变量,这样它们将存储在接收者对象中并可供其他人访问closures/extensions.
这是将 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
的 属性,并将值存储在该映射中,但您将无法使用常规 属性 语法访问它们,除非您事先知道哪些值将存储在那里。
我正在尝试在 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 中是否有某种机制允许我这样做,在 closure/extension 中创建变量,这样它们将存储在接收者对象中并可供其他人访问closures/extensions.
这是将 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
的 属性,并将值存储在该映射中,但您将无法使用常规 属性 语法访问它们,除非您事先知道哪些值将存储在那里。