【发布时间】:2017-10-08 12:51:37
【问题描述】:
我正在使用 Kotlin 本地库对象在 Kotlin 中工作,该对象包含 .nameIsMuchTooLongAndIsStillNotClear 的方法。以类似于typealias 的方式,我想为该方法创建一个别名,因此我可以将其称为.shortAndClear。为了使事情稍微复杂化,这些函数有几个参数,其中许多具有我不希望在包装器中预处理的默认值。经过进一步研究,extension function 似乎仍然是要走的路。
要使用易于测试的示例函数,假设我想为String.startsWith 创建一个别名类型的扩展名,称为String.beg。我可以轻松获得以下解决方案:
inline fun String.beg(prefix: CharSequence, ignoreCase: Boolean = false) = startsWith(prefix, ignoreCase) // works ok
但是,这似乎要求我列出所有参数及其默认值,并且对每个重载都这样做。 (有问题的真正方法签名要长得多,有更多的默认值。)本着“不要重复自己”的精神,有没有办法可以使用function reference 到String::startsWith,这样我就没有枚举所有论点?我已经尝试了几种形式,但它们都不起作用:
// none of these work:
fun String.beg = String::startsWith
fun String.beg = this::startsWith
val String.beg: (CharSequence, Boolean) -> Boolean = String::startsWith
【问题讨论】:
标签: kotlin extension-methods kotlin-extension