gpt4 book ai didi

extension-methods - 如何从定义它们的类外部调用扩展方法?

转载 作者:IT老高 更新时间:2023-10-28 13:41:16 25 4
gpt4 key购买 nike

这是一个演示问题的最小示例:

abstract class Base {
abstract fun String.extension(x: Char)
}

class Derived : Base() {
override fun String.extension(x: Char) {
// Calling lots of methods on String, hence extension method
println("${first()} $length ${last()} ${firstOrNull { it == x }} ...")
}
}

从 Java 调用扩展方法很简单:

Base o = new Derived();
o.extension("hello world", 'l');

但我不知道如何在纯 Kotlin 中做到这一点。 StringBase 似乎都没有 extension 方法。

最佳答案

首先,注意定义为成员的扩展函数需要两个接收者,一个是封闭类的实例(dispatch receiver,通常是封闭类的this ),另一个是函数扩展的类型的实例(扩展接收器)。这已记录在 here .

因此,要从类外部调用这样的函数,您必须提供两个接收器。 Kotlin doesn't have any syntax(x, "abc").stringExtension() 那样明确地做到这一点,但是您可以使用 extension lambda 隐式地提供调度接收器:

class C(val name: String) {
fun String.extended() = this + " extended by " + name
}

fun main(args: Array<String>) {
val c = C("c")
with(c) { println("abc".extended()) }
}

(runnable demo of this code)

with(...) { ... } block ,c 成为隐式接收器,因此允许您将其用作 C 成员扩展中的调度接收器。这适用于任何其他将函数类型与接收器一起使用的函数:applyrunuse 等。

在您的情况下,它将是 with(o) { "hello world".extension('l') }

作为 @KirillRakhman注意,C 的扩展函数的扩展接收器也可以隐式用作 C 中定义的扩展的调度接收器:

fun C.someExtension() = "something".extended()

关于extension-methods - 如何从定义它们的类外部调用扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42746965/

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