gpt4 book ai didi

function - Kotlin 顶级函数作用域和阴影

转载 作者:行者123 更新时间:2023-12-05 00:50:59 28 4
gpt4 key购买 nike

假设我编写了一个包含以下代码的 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.3 版开始)或,据我所知,Android Studio 有什么要说的吗?

最佳答案

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

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.kt , test2.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在 call-site 函数,然后你可以跳转到该函数实际调用的源代码,例如:
fun foo(){
println("bar");
// ^--- move the cursor here and press `CTRL+B`/`CTRL+ALT+B`/`F4`
}

关于function - Kotlin 顶级函数作用域和阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44912705/

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