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

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

1 に答える 1

1

Kotlin は静的に型付けされた言語です。オブジェクト内にフィールドがないオブジェクトのインスタンス内にデータを格納することはできません。

type のプロパティを定義し、Mapそのマップ内に値を格納することはできますが、そこに格納される値が事前にわかっていない限り、通常のプロパティ構文を使用してそれらにアクセスすることはできません。

于 2016-05-31T20:54:12.670 に答える