示例:
class Foo {
fun foo() = Unit
}
object Bar {
val Foo.foo get() = Unit
}
fun Foo.bar() = Bar.foo
扩展符号在类实例中时不是静态的,所以我不明白为什么仅仅通过传入接收器就不可能实现这一点。
答案 0 :(得分:2)
您可以执行此操作,但是您还必须将Bar
作为接收者,以及对someFoo.foo
的引用,否则您将说Bar
具有属性{ {1}},但不是。它在其范围(及其实例)中具有foo
的扩展名。因此,请从以下位置更改您的最后一行:
Foo.foo
收件人:
fun Foo.bar() = Bar.foo
从概念上来说是这样的:
fun Foo.bar() = with (Bar) { foo }
因此,我们使用fun Foo.bar() = with (Bar) { this@bar.foo }
将with
接收者堆叠在Bar
的{{1}}实例接收者之下,并访问属性Foo
。