如何解析具有相同名称的Kotlin函数/属性?

时间:2018-08-11 13:09:43

标签: kotlin language-design

以下语句编译并打印Immediate Window

"fun: called"

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

正在寻找为什么要首先编译的说明?
在该属性上选择功能的规则是什么?

注意:可以通过以下方式调用fun main(vararg args: String) { fun toCall(arg: String) = println("fun: $arg") val toCall = fun(arg: String) = println("val: $arg") toCall("called") }

  • val
  • (toCall)("called")

1 个答案:

答案 0 :(得分:1)

This document regarding name resolution包含有关它的详细信息。

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

总而言之,编译器将函数(成员/扩展名/成员扩展名)/属性划分为组,并确定首先调用哪个...属性被置于invoke函数组和在以下段落中,您已经了解了为什么在val之前使用了该函数:

  

将该属性与invoke函数一起考虑。具有invoke函数的属性组与常规函数组混合在一起,从某种意义上说,一组属性的优先级高于一组函数,反之亦然。但是,功能和属性不能放在同一组中:功能始终超过相同类别的属性。属性和invoke函数均确定组的优先级:我们将属性和invoke函数的优先级进行比较,“最低”的将成为组优先级。

这就是为什么在这里首先考虑该函数,然后再考虑该属性的原因。一旦指定了invoke,就很明显它只能是属性,因为函数本身没有可见的invoke(现在不让字节码掉下来;-)。现在(toCall)的行为类似。显然,toCall只能是该属性。不能通过函数调用(toCall)(编译错误:预期会调用函数/未找到函数invoke)。

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

  

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