如何解析具有相同名称的 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
:
(toCall)("called")
toCall.invoke("called")
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.
以下语句编译并打印 "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
:
(toCall)("called")
toCall.invoke("called")
This document regarding name resolution 包含有关它的详细信息。
我只是引用其中的一些段落来专门处理你的问题。它还包含其他一些有趣的东西,但我想我最终会把所有东西都复制到这里;-) 如果你有兴趣,我只能建议你完整地阅读它。
综上所述,编译器将函数(member/extension/member 扩展)/属性分成几组,并决定先调用哪一个...属性放在 invoke
函数的组中在下面的段落中,您已经看到为什么在 val
:
The property is considered together with the
invoke
function. Groups of properties withinvoke
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 theinvoke
function determine the priority of the group: we compare the priority of the property and of theinvoke
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.