【问题标题】:Kotlin top-level function scopes & shadowingKotlin 顶级函数作用域和阴影
【发布时间】:2017-12-08 07:46:43
【问题描述】:

假设我编写了一个包含以下代码的 Kotlin 包:

package CoolWithATwist

// code that solves the TSP in linear time followed by this:

fun <T> println(x: T) {
    kotlin.io.println(x)
    haltAndCatchFire()  // or any annoying/destructive function
}

如果包以字节码形式分发,我是否正确假设 Kotlin 关于默认导入标准库模块的规则按照 the documentation 以及随后导入另一个模块(如 CoolWithATwist)实际上会影响标准库自动 -包含 println 函数,因此如果用户实际调用 println,上述代码将执行?

检测此问题的最佳方法是什么,因为 Kotlin 编译器不会警告隐藏全局函数或必须显式命名您实际调用的函数,IntelliJ Idea 上的 Kotlin 插件也不会发出警告(从 1.1.1 版开始)。 3) 或者,据我所知,Android Studio 对此有何评论?

【问题讨论】:

  • 1.你可以测试一下。 2.module CoolWithATwist是什么?你的意思是package CoolWithATwist?您需要导入类和函数才能使用它们。如果您这样做,那么您选择 使用该功能。没有什么能阻止您定义一个类 List,例如,它会影响 kotlin List 类。事实上,这种情况一直在发生。例如,JDK 有两个 List 类,许多其他类共享相同的名称。
  • @OliverCharlesworth,我愿意,谢谢。
  • 就像你使用import java.awt.*;一样。但明星导入是一种不好的做法,这是有充分理由的。
  • 我也讨厌这样。这是我在首选项中禁用的功能之一。
  • 但问题是,据我所知,在 Java 中,当您在范围内的两个不同包中拥有两个同名的函数时,您总是会被问到要使用哪一个。这似乎不会发生在这里。如果您导入 CoolWithATwist.*,IDE 不会询问您是否要使用 CoolWithATwist.println() 或 kotlin.io.println() 这对我来说似乎有点奇怪。请注意,我绝不是 Java 专家,所以我可能对导入的工作方式有误,但我看到 IntelliJ 经常问我要使用哪一个。在这种情况下它不会这样做。

标签: function scope kotlin


【解决方案1】:

假设您的源文件夹中有以下类:

kotlin
|
|---- CoolWithATwist
|        |
|        |--- function.kt which contains your own println() function
|        |
|        |--- test1.kt (no imports)
|        |
|        |--- test2.kt (import kotlin.io.println)
|        |
|        |--- test.kt (import kotlin.io.*)
|        |
|        |___ NestedPackage
|                   |
|                   |___ test3.kt (no imports)
|
|____ main.kt 

main.kttest2.kttest3.kt 将直接使用kotlin.io.println

test1.kt 将使用包顶级函数println

test.kt 将使用包顶级函数println,因为星号导入语句的优先级低于包顶级范围。

表示kotlin中的函数查找策略不冒泡,只查找自身包中的顶层函数。查找策略顺序为:local > enclosing > function > class > script > import statement > package top-level > star import statement > kotlin top-level

你可以在调用点函数处简单地使用CTRL+B/CTRL+ALT+B/F4,然后你可以跳转到该函数实际调用的源代码,例如:

fun foo(){
   println("bar");
   // ^--- move the cursor here and press `CTRL+B`/`CTRL+ALT+B`/`F4`
}

【讨论】:

    猜你喜欢
    • 2019-07-18
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多