如何解析具有相同名称的 Kotlin functions/properties?

How resolving Kotlin functions/properties with the same name work?

以下语句编译并打印 "fun: called":

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

注意:如果它们是顶级声明或在 class 内,也会出现同样的问题,这只是本地 function/variable.

的最简单复制

想要澄清为什么首先要编译?
选择 属性 函数的规则是什么?

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

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

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

综上所述,编译器将函数(member/extension/member 扩展)/属性分成几组,并决定先调用哪一个...属性放在 invoke 函数的组中在下面的段落中,您已经看到为什么在 val:

之前使用该函数

The property is considered together with the invoke function. Groups of properties with invoke functions are mixed with groups of regular functions, in a sense that a group of properties can have higher priority than a group of functions and vice versa. However, functions and properties can’t go in one group: the function always surpasses the property of the same category. Both the property and the invoke function determine the priority of the group: we compare the priority of the property and of the invoke function and the "lowest" one becomes the group priority.

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

链接文档还包含一个示例,其中包含成员 属性 函数,后跟此语句,这基本上也证实了之前关于本地函数的内容:

Note that there is no member function named foo, but if it was present, it would be put into a separate group with the highest priority.