gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 04:28:22 31 4
gpt4 key购买 nike

我正在 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 referenceString::startsWith这样我就不必枚举所有参数?我尝试了几种形式,但都不起作用:

// none of these work:
fun String.beg = String::startsWith
fun String.beg = this::startsWith
val String.beg: (CharSequence, Boolean) -> Boolean = String::startsWith

最佳答案

目前没有办法完全实现您想要做的事情。如果您想保留默认参数,您必须执行以下操作(如您所说):

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

关于Kotlin 扩展方法作为长方法名称的别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46631293/

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