Kotlin扩展方法作为长方法名的别名?

时间:2017-10-08 12:51:38

标签: kotlin extension-methods kotlin-extension

我在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

2 个答案:

答案 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)
}