Edit Page

this式

現在のレシーバを指し示すには、this式が使えます:

thisに限定子が無ければ、それは一番内側の囲んでるスコープを指します。 外側のスコープのthisを参照するためには、ラベル限定子が使われます:

限定子付きthis

(訳注:qualified this)

外側のスコープのthis(外側のクラス拡張関数、ラベル付けされたレシーバ付き関数リテラルthis)にアクセスするには、 this@labelという形式を使います。ここで@labelはアクセスしたいスコープのラベルです:

class A { // 暗黙のラベル @A
    inner class B { // 暗黙のラベル @B
        fun Int.foo() { // 暗黙のラベル @foo
            val a = this@A // Aの this
            val b = this@B // Bの this

            val c = this // foo()のレシーバ、Int
            val c1 = this@foo // foo()のレシーバ、Int

            val funLit = lambda@ fun String.() {
                val d = this // funLitのレシーバ、String
            }

            val funLit2 = { s: String ->
                // foo()のレシーバ、なぜなら囲んでるラムダ式はレシーバを持たないから
                val d1 = this
            }
        }
    }
}

暗黙のthis

thisのメンバ関数を呼ぶ時は、this.の部分をスキップする事が出来る。 同じ名前の非メンバ関数があった場合は、注意してこの機能を使う事。なぜならそちらが代わりに呼ばれてしまう場合もあるから:

fun main() { //sampleStart fun printLine() { println("トップレベル関数") } class A { fun printLine() { println("メンバ関数") } fun invokePrintLine(omitThis: Boolean = false) { if (omitThis) printLine() else this.printLine() } } A().invokePrintLine() // メンバ関数 A().invokePrintLine(omitThis = true) // トップレベル関数 //sampleEnd() }