Kotlin 如何在内部类上调用函数
以下代码发布在Kotlin的网站上:Kotlin 如何在内部类上调用函数,kotlin,Kotlin,以下代码发布在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()
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.
在这种情况下,foo是在B中定义的扩展函数。默认情况下,您不能从外部调用这些函数。但是,当您进入B的范围时,可以执行该函数,这可以通过作用域函数实现,例如。请注意,此扩展函数只能在Int的实例上调用
在这种情况下,foo是在B中定义的扩展函数。默认情况下,您不能从外部调用这些函数。但是,当您进入B的范围时,可以执行该函数,这可以通过作用域函数实现,例如。请注意,此扩展函数只能在Int的实例上调用
让我们看一个更简单的例子:
class A {
inner class B {
fun foo() {
// ...
}
}
}
要在内部类中调用函数,必须使用外部类的实例访问它,如下所示:
A().B().foo()
使您的示例更加困难的是Int.foo是一个扩展函数,因此要访问它,您必须在与扩展函数相同的范围内对Int调用foo:
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
}
这里我们添加了一个与扩展函数在同一范围内的函数调用程序。代码输出以下内容:
Foo调用整数10让我们看一个更简单的例子:
class A {
inner class B {
fun foo() {
// ...
}
}
}
要在内部类中调用函数,必须使用外部类的实例访问它,如下所示:
A().B().foo()
使您的示例更加困难的是Int.foo是一个扩展函数,因此要访问它,您必须在与扩展函数相同的范围内对Int调用foo:
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
}
这里我们添加了一个与扩展函数在同一范围内的函数调用程序。代码输出以下内容:
Foo调用了integer 10我写了一篇关于这些函数的文章:但实际上,对于这些场景,with是最好的选择。要明确的是,这是可能的,因为使用lambdas与receiverThis不编译。它生成一个未解析引用的错误:foo。你能提供一个实际的例子吗?谢谢。我发布的代码实际上没有问题。你能分享你的版本吗?@AndroidDev这段代码在.kt文件中使用时无法独立工作,请将其包装在instanceWell的main中,因为Android应用程序中没有main,所以我不能这样做。我尝试将其放在活动的onCreate方法中,但也没有任何帮助。这不重要。我只是好奇为什么这个示例代码会被发布在kotlin官方网站上,该网站主要用于Android开发,但没有显示出使用它的实际方式。下面是我写的一篇关于这些功能的文章:但实际上with是这些场景的最佳选择。要明确的是,这是可能的,因为使用lambdas与receiverThis不编译。它生成一个未解析引用的错误:foo。你能提供一个实际的例子吗?谢谢。我发布的代码实际上没有问题。你能分享你的版本吗?@AndroidDev这段代码在.kt文件中使用时无法独立工作,请将其包装在instanceWell的main中,因为Android应用程序中没有main,所以我不能这样做。我尝试将其放在活动的onCreate方法中,但也没有任何帮助。这不重要。我只是好奇为什么这个示例代码会被发布在kotlin官方网站上,该网站主要用于Android开发,但没有实际的使用方法。你能提供一个在与扩展函数相同范围内的Int上调用foo的实例吗。谢谢。这就澄清了问题,但我现在意识到您不能调用扩展函数Int.foo。它必须通过另一个不是扩展调用方的函数。请提供一个在与扩展函数相同的范围内对Int调用foo的实际示例。谢谢。这就澄清了问题,但我现在意识到您不能调用扩展函数Int.foo。它必须通过另一个不是扩展调用方的函数