Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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_Language Design - Fatal编程技术网

解析同名的Kotlin函数/属性如何工作?

解析同名的Kotlin函数/属性如何工作?,kotlin,language-design,Kotlin,Language Design,下面的语句编译并打印“fun:called”: 注意:如果它们是顶级声明或在类内,则会出现相同的问题,这只是带有局部函数/变量的最简单的复制 想了解为什么要编译它吗? 选择函数而不是属性的规则是什么? 注意:可以通过以下方式调用valone: (toCall)(“被调用”) toCall.invoke(“调用”) 包含有关它的详细信息 我将引用其中的一些段落专门讨论你的问题。它还包含其他一些有趣的东西,但我想我最终会复制这里的所有东西;-)如果你感兴趣,我只能建议你完整地阅读它 总之,编译器将

下面的语句编译并打印
“fun:called”

注意:如果它们是顶级声明或在类内,则会出现相同的问题,这只是带有局部函数/变量的最简单的复制

想了解为什么要编译它吗?
选择函数而不是属性的规则是什么?

注意:可以通过以下方式调用
val
one:

  • (toCall)(“被调用”)
  • toCall.invoke(“调用”)
包含有关它的详细信息

我将引用其中的一些段落专门讨论你的问题。它还包含其他一些有趣的东西,但我想我最终会复制这里的所有东西;-)如果你感兴趣,我只能建议你完整地阅读它

总之,编译器将函数(member/extension/member extension)/属性划分为多个组,并决定首先调用哪个组。。。属性被放在
invoke
-函数组中,在下面的文章中,您已经了解了为什么在
val
之前使用该函数:

该属性与
invoke
函数一起考虑。具有
invoke
函数的属性组与常规函数组混合,从某种意义上说,一组属性可以比一组函数具有更高的优先级,反之亦然。但是,函数和属性不能归为一组:函数始终优于同一类别的属性。属性和
invoke
函数都决定了组的优先级:我们比较属性和
invoke
函数的优先级,“最低”一个成为组优先级

这就是为什么这里先考虑函数,然后再考虑属性。一旦指定了
invoke
,很明显它只能是属性,因为函数本身没有可见的
invoke
(现在不要往下看字节码;-)。现在
(toCall)
的行为类似。这里很清楚,
toCall
只能是属性。无法使用函数调用
(toCall)
(编译错误:预期函数调用/未找到函数
调用

链接文档还包含一个示例,该示例后面有一个成员属性函数,该语句基本上也确认了前面关于本地函数的内容:

请注意,没有名为foo的成员函数,但如果它存在,它将被放入具有最高优先级的单独组中

相关的:相关的:
fun main(vararg args: String) {
    fun toCall(arg: String) = println("fun: $arg")
    val toCall = fun(arg: String) = println("val: $arg")
    toCall("called")
}