以下代码已发布在Kotlin的网站上:
class A { // implicit label @A
inner class B { // implicit label @B
fun Int.foo() { // implicit label @foo
val a = this@A // A's this
val b = this@B // B's this
val c = this // foo()'s receiver, an Int
val c1 = this@foo // foo()'s receiver, an Int
val funLit = lambda@ fun String.() {
val d = this // funLit's receiver
}
val funLit2 = { s: String ->
// foo()'s receiver, since enclosing lambda expression
// doesn't have any receiver
val d1 = this
}
}
}
}
我不清楚您如何在内部类中调用函数。例如,如何调用Int.foo()
var a = A()
a.Int.foo() // This is not allowed.
答案 0 :(得分:3)
让我们看一个更简单的例子:
class A {
inner class B {
fun foo() {
// ...
}
}
}
要在内部类中调用函数,必须使用外部类的实例访问它,如下所示:
A().B().foo()
使示例更加困难的是Int.foo()
是扩展函数,因此要访问它,必须在与扩展函数相同的作用域内的foo()
上调用Int
:< / p>
class A { // outer class A
inner class B { // inner class B
fun Int.foo() { // entension function foo
print("Foo called on integer $this")
}
fun caller(i: Int) { // calls extension function
i.foo()
}
}
}
fun main() {
A().B().caller(10) // calls extension function in inner class B
}
在这里,我们添加了功能caller
,该功能与扩展功能的作用域相同。该代码输出以下内容:
Foo called on integer 10
答案 1 :(得分:1)
在这种情况下,foo
是B
中定义的扩展功能。默认情况下,您无法从外部调用这些member extension functions。但是,可以在进入B
的范围时执行该功能,这可以通过诸如with
之类的作用域功能来实现。请注意,只能在Int
的实例上调用此扩展功能。
val a = A()
val b = a.B()
with(b) {
5.foo()
}