kotlin 区分功能和扩展

lh80um4z  于 2022-11-25  发布在  Kotlin
关注(0)|答案(2)|浏览(116)

我试着写一个函数,它可以插入到任何表达式中,以便记录值:

val x = (2.debug() + 3.debug()).debug("2+3")

但是我写了下面的无限循环:

fun debug (message: String) {
    Log.d (R.string.app_name.toString(), message) }

fun <T> T.debug (tag: String = "value"): T {
    debug ("$tag: $this")
    return this 
}

我的目标是编写一个“普通”函数(第一个)和一个扩展函数(第二个),扩展函数应该调用普通函数。
我的代码中的问题是:扩展函数调用它自己而不是普通函数。2我不明白这一点,因为我没有在扩展函数中指定一个示例接收器。
如何解决这个问题?

vof42yt1

vof42yt11#

如果每个函数中的参数名称不同,则可以更改第二个函数,使其使用命名参数调用第一个函数:

fun <T> T.debug (tag: String = "value"): T {
    debug (message = "$tag: $this")
    return this
}
2uluyalo

2uluyalo2#

我找不到从扩展方法中剥离this的方法,因此最好的方法是创建不同名称的 Package 器:

fun <T> T.debug (tag: String = "value"): T {
    debugWrapper( "$tag: $this")
    return this
}

fun debug (message: String) {
    Log.d ("tag", message)
}

private fun debugWrapper (message: String) {
    debug(message)
}

我认为您希望将现有呼叫保留到debug,而这可以实现。
我尝试研究反编译代码(为了清楚起见,去掉了默认参数),希望通过名称空间来区分它们:

public final class TestclassKt {
    public static final Object debug(Object $this$debug, @NotNull String tag) {
        Intrinsics.checkNotNullParameter(tag, "tag");
        debug($this$debug, tag + ": " + $this$debug);
        return $this$debug;
    }

    public static final void debug(@NotNull String message) {
        Intrinsics.checkNotNullParameter(message, "message");
        Log.d("tag", message);
    }
}

但是这两个方法在同一个命名空间中,唯一区分它们的方法是通过参数。
我想你已经让Kotlin崩溃了。

相关问题