【发布时间】:2017-11-22 14:27:39
【问题描述】:
我发现了一件有趣的事情,但我做不到。有没有办法让本地扩展方法在带有接收器的函数中可用。
val list = ArrayList<Any>();
fun <T> Array<T>.bind(context: MutableList<in T>, block: Array<T>.() -> Unit) {
fun Array<T>.save() {
context.addAll(this);
}
block();
}
arrayOf(1, 2, 3).bind(list) {
save(); //todo: how to bind extension in execution scope
};
我知道可以通过为接收器引入另一种类型来替代方法,但我想避免它。例如:
interface Savable {
fun save();
}
fun <T> Array<T>.bind(context: MutableList<in T>, block: Savable.() -> Unit) {
val proxy = object : Savable {
override fun save() {
context += this@bind;
}
};
proxy.block();
}
【问题讨论】:
-
我很难理解您想要达到的目标。能给个用例吗?
-
@KirillRakhman 先生。确实,如果您熟悉
ruby,此功能并不新鲜。它可以动态地将其他方法添加到object范围而不是class范围。假设我们有一个Entity类,我希望将CURD方法绑定到某个对象而不是类级别。 -
另一种选择可能是将保存函数作为参数传递给
block。 -
@marstran 这个想法不错,但是当我们有超过六个扩展方法时如何处理?
-
如果你想这样做,我认为你应该介绍你的界面。
标签: scope kotlin extension-methods