我写了一个startsWith(substring)
扩展名,它也适用于可为空的字符串。不幸的是,我的执行导致StackOverflowError,导致扩展程序将自身称为自身,而不是String.startsWith(..)
方法。
private fun String?.startsWith(sub: String): Boolean = this?.startsWith(sub)==true
可以打String.startsWith(..)
吗?
答案 0 :(得分:3)
您可以使用import as
语法以其他名称显式导入标准库的startsWith
方法,然后可以使用该名称而不会发生冲突:
import kotlin.text.startsWith as ktStartsWith
private fun String?.startsWith(sub: String): Boolean = this?.ktStartsWith(sub) == true
答案 1 :(得分:1)
您可以这样写:
private fun String?.startsWith(sub: String): Boolean = this?.startsWith(sub, false) == true
使用来自startsWith
的{{1}}签名:
StringsJVM.kt
这样,通过将值显式传递给public fun String.startsWith(prefix: String, ignoreCase: Boolean = false): Boolean
参数,
您避免了递归,因为您的扩展函数不再调用自身。
答案 2 :(得分:0)
您应该先执行空检查,然后将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
不会调用您自己的扩展方法。