gpt4 book ai didi

kotlin - 如何从 lambda 引用外部函数?

转载 作者:行者123 更新时间:2023-12-04 23:36:36 25 4
gpt4 key购买 nike

问题在评论中。我想引用外层函数append ,而不是在 StringBuilder 中定义的那个, 我该怎么做呢?

fun append(c: Char) {
println("TEST")
}

fun sbTest() = with(StringBuilder()) {
for(c in 'A'..'Z') {
append(c) // how do I refer to the append function declared above?
}
toString()
}

我知道我可以引入一个函数引用变量,像这样:
val f = ::append
并调用 f而不是 append ,但还有其他方法吗?

最佳答案

问题是在 with 内调用的任何内容隐藏外部函数,因为 this介绍。如果您有一个类和一个具有相同签名的函数的顶级函数,则会出现同样的问题。

显而易见的选择就是重新命名它。此外,与实际功能相比,您拥有的功能并没有真正的描述性。但是如果您由于某种原因无法重命名,还有其他选择。

Kotlin 中的包可以引用顶级方法,例如 com.some.package.method .它也可以像这样导入,这是最常见的方法。很少有方法被称为 com.some.package.method() .

Kotlin 和 Python 一样,允许 as在进口。这意味着,你可以这样做:

package com.example;

// This is the important line; it declares the import with a custom name.
import com.example.append as appendChar; // Just an example name; this could be anything ***except append***. If it's append, it defeats the purpose

fun append(c: Char) {
println("TEST")
}

fun sbTest() = with(StringBuilder()) {
for(c in 'A'..'Z') {
appendChar(c)
}
toString()
}

或者,正如我提到的,您可以添加包:
for(c in 'A'..'Z') {
com.example.append(c)
}
val f = ::append当然也是一种选择,无论哪种方式,重命名函数仍然比使用 as 创建导入更容易。或常量,假设您有权访问该函数(并且它不属于依赖项)。

如果您的文件在包之外,我不建议您这样做,您可以将导入声明为:
import append as appendChar

关于kotlin - 如何从 lambda 引用外部函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52138211/

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