代码之家  ›  专栏  ›  技术社区  ›  TWiStErRob

如何解析同名的Kotlin函数/属性?

  •  5
  • TWiStErRob  · 技术社区  · 6 年前

    下面的语句编译并打印 "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")
    • toCall.invoke("called")
    1 回复  |  直到 6 年前
        1
  •  1
  •   Roland    6 年前

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

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

    总而言之,编译器将函数(成员/扩展/成员扩展)/属性分成多个组,并决定首先调用哪个。。。属性放在 invoke -函数,在下面的文章中,您已经了解了为什么在 val :

    援引 援引 函数与正则函数组混合,在某种意义上,一组属性的优先级可以高于一组函数,反之亦然。但是,函数和属性不能放在一个组中: . 财产和 函数决定组的优先级:我们比较属性和 援引 功能和“最低”功能成为组优先级。

    援引 很明显,它只能是属性,因为函数本身不可见 (现在不要往下看字节码;-))。现在 (toCall) 行为相似。这里很清楚 toCall 使用函数(编译错误:需要函数调用/函数 援引

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