gpt4 book ai didi

kotlin - Kotlin 中的字符串扩展

转载 作者:行者123 更新时间:2023-12-05 02:32:04 27 4
gpt4 key购买 nike

我创建了一个类并向其添加了一个与成员函数具有相同签名的扩展,并执行了这个方法,它总是执行成员方法。

class Worker {
fun work() = "...working"
}
fun Worker.work() = "...still working"

然后我为一个已经可用的方法 replace 创建了一个 String 类的扩展,并执行这个 replace 方法;它改为调用扩展方法并将 Hell 作为输出。

   fun String.replace(oldValue: String, newValue: String, ignoreCase: Boolean = false): String =  this.substring(0, this.length - 1);

然后

fun main(args: Array<String>) {
val worker = Worker()
println(worker.work()) // output: ...working

val myString= "Hello"
val result1 = myString.replace("Hello", "Bye")
println("First character is: $result1") // output: First character is: Hell
}

我错过了什么?我原以为 replace 会给出 Bye 作为输出。

val myString= "Hello"
val result1 = myString.replace("Hello", "Bye")
println("First character is: $result1") // output: First character is: Bye

String 如何在 Kotlin 中与扩展一起工作?

最佳答案

请注意,标准库中现有的replace函数也是一个扩展函数,声明在kotlin.text包中。

fun String.replace(oldChar: Char, newChar: Char, ignoreCase: Boolean = false): String

您可以访问它,因为 kotlin.text 是隐式导入的。

因为你的 replace 和现有的 replace 都是扩展函数,但是现有的 replace 是隐式导入的,重载决议选择你的 替换

language specification 中描述了确切的优先级:

If a call is correct, for a callable f with an explicit receiver e oftype T the following sets are analyzed (in the given order):

  1. Non-extension member callables named f of type T;
  2. [...]
  3. [...]
  4. Extension callables named f, whose receiver type U conforms to type T, declared in the package scope;
  5. [...]
  6. Implicitly imported extension callables named f (either from the Kotlin standard library or platform-specific ones), whose receivertype U conforms to type T.

[...]

When analyzing these sets, the first set which contains any applicable callable is picked for c-level partition, which gives us the resulting overload candidate set.

Set 6 包含标准库中现有的replace。第 4 组包含您已声明的 replacework 扩展。集合 1 包含在 Worker 中声明的 work 方法。

由于 Kotlin 查找名称的顺序不同,您会看到不同的结果,具体取决于原始函数的声明位置和导入方式。

关于kotlin - Kotlin 中的字符串扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71361686/

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