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