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 を使用する初めての試みです。ドキュメントを読みましたが、何か(多く)が欠けている可能性があります。自由に正しい方向を指してください
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
}
}