我在Kotlin工作,使用包含.nameIsMuchTooLongAndIsStillNotClear
方法的Kotlin本地库对象。以类似于typealias
的方式,我想为方法创建别名,因此我可以将其称为.shortAndClear
。稍微复杂一点,这些函数有几个参数,其中许多都有默认值,我不想在包装器中预处理。经过进一步的研究,似乎仍然需要extension function。
要使用易于测试的示例函数,请假设我要为String.startsWith
创建一个名为{{的{al}的别名类型扩展名1}}。我可以很容易地得到以下解决方案:
String.beg
但是,这似乎要求我列出所有参数及其默认值,并为每次重载执行此操作。 (真正的方法签名相当长,有更多默认值。)本着“不要重复自己”的精神,有没有办法可以使用function reference来{ {1}}所以我不必列举所有论点?我尝试了几种形式,但没有一种形式起作用:
inline fun String.beg(prefix: CharSequence, ignoreCase: Boolean = false) = startsWith(prefix, ignoreCase) // works ok
答案 0 :(得分:5)
目前没有办法完全实现您的目标。如果你想保留你的默认参数,你必须这样做(如你所说):
fun String.beg(prefix: CharSequence, ignoreCase: Boolean = false) = startsWith(prefix, ignoreCase)
// Or if you know that ignoreCase will be always false, you can pass the value directly to "startsWith()
fun String.beg(prefix: CharSequence) = startsWith(prefix, false)
相反,如果你没有默认参数,或者你不在乎如果你必须在调用函数时传递默认值,你可以使用函数参考。
val String.beg: (CharSequence, Boolean) -> Boolean get() = this::startsWith
// If the parameters can be inferred, you can avoid the type specification.
// In this case it won't compile because there are several combinations for "startsWith()".
val String.beg get() = this::startsWith
在这种情况下,您无法指定参数的默认值,因为beg
是一个lambda。
自Kotlin 1.2(目前处于测试阶段)以来,您可以避免在函数引用上指定this
。上面写的相同的例子,但在Kotlin 1.2中:
val String.beg: (CharSequence, Boolean) -> Boolean get() = ::startsWith
// If the parameters can be inferred, you can avoid the type specification.
// In this case it won't compile because there are several combinations for "startsWith()".
val String.beg get() = ::startsWith
答案 1 :(得分:0)
您还可以使用导入别名,例如:
import kotlin.text.startsWith as beg
fun main() {
"foo".beg("fo")
"bar".beg('B', true)
}