Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何在内部类上调用函数_Kotlin - Fatal编程技术网

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()

以下代码发布在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.
在这种情况下,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。它必须通过另一个不是扩展调用方的函数