Kotlin:如何在扩展中调用同名方法?
Kotlin: How to call a method with the same name in an extension?
我写了一个 startsWith(substring)
扩展,它也适用于可为 null 的字符串。不幸的是,我的实现导致 WhosebugError 导致扩展调用它自己而不是 String.startsWith(..)
方法。
private fun String?.startsWith(sub: String): Boolean = this?.startsWith(sub)==true
是否可以调用 String.startsWith(..)
?
你应该先做空检查,然后调用startsWith
给非空String
。这是一个使用 run
:
的例子
private fun String?.startsWith(sub: String, ignoreCase: Boolean = false): Boolean = this?.run{startsWith(sub, ignoreCase)} ?: false
块内 this?.run{ /* this is non-null inside here */}
。所以在里面调用startsWith
不会调用自己的扩展方法
你可以这样写:
private fun String?.startsWith(sub: String): Boolean = this?.startsWith(sub, false) == true
使用 startsWith
来自 StringsJVM.kt
的签名:
public fun String.startsWith(prefix: String, ignoreCase: Boolean = false): Boolean
这样,通过显式将值传递给 ignoreCase
参数,
您避免递归,因为您的扩展函数不再调用自身。
您可以使用 import as
语法以不同的名称显式导入标准库的 startsWith
方法,这样您就可以使用而不会发生冲突:
import kotlin.text.startsWith as ktStartsWith
private fun String?.startsWith(sub: String): Boolean = this?.ktStartsWith(sub) == true
我写了一个 startsWith(substring)
扩展,它也适用于可为 null 的字符串。不幸的是,我的实现导致 WhosebugError 导致扩展调用它自己而不是 String.startsWith(..)
方法。
private fun String?.startsWith(sub: String): Boolean = this?.startsWith(sub)==true
是否可以调用 String.startsWith(..)
?
你应该先做空检查,然后调用startsWith
给非空String
。这是一个使用 run
:
private fun String?.startsWith(sub: String, ignoreCase: Boolean = false): Boolean = this?.run{startsWith(sub, ignoreCase)} ?: false
块内 this?.run{ /* this is non-null inside here */}
。所以在里面调用startsWith
不会调用自己的扩展方法
你可以这样写:
private fun String?.startsWith(sub: String): Boolean = this?.startsWith(sub, false) == true
使用 startsWith
来自 StringsJVM.kt
的签名:
public fun String.startsWith(prefix: String, ignoreCase: Boolean = false): Boolean
这样,通过显式将值传递给 ignoreCase
参数,
您避免递归,因为您的扩展函数不再调用自身。
您可以使用 import as
语法以不同的名称显式导入标准库的 startsWith
方法,这样您就可以使用而不会发生冲突:
import kotlin.text.startsWith as ktStartsWith
private fun String?.startsWith(sub: String): Boolean = this?.ktStartsWith(sub) == true