gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:36:44 28 4
gpt4 key购买 nike

以下语句编译并打印“fun:叫”:

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

注意:如果它们是顶级声明或在类内部,也会出现同样的问题,这只是本地函数/变量的最简单的重现。

首先想了解为什么会编译?
选择函数而不是属性的规则是什么?

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

  • (toCall)("被叫")
  • toCall.invoke("被叫")

最佳答案

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

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

总结一下,编译器将函数(成员/扩展/成员扩展)/属性分组,并决定先调用哪一个...属性被放入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.

关于kotlin - 如何解析具有相同名称的 Kotlin 函数/属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51800008/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com