代理人/代表在Scala
我最近看到过几个Scala问题(例如
here,
here和
here),它要求使用代理,而且在我自己的工作中出现了不止一次。 Scala库有许多代理特征(14,如果我正确计数)。
代理类/特征通常包含很多样板: class FooProxy(val self: Foo) extends Foo { // added behavior def mymethod = ... // forwarding methods def method1 = self.method1 def method2(arg: String) = self.method2(arg) ... } trait Foo { def method1: Unit def method2(arg: String): Unit } 我的第一个想法是定义一个可以使用如下的Proxy [T]特征: class FooProxy(val self: Foo) extends Proxy[Foo] { // added behavior def mymethod = ... } 其中trait Proxy [T]扩展T.当然,实际上不可能在没有编译器魔术的情况下定义Proxy trait。 我的下一个想法是寻找一个编译器插件(这样的功能显然不在现有的编译器中,或者这些14个代理特征的来源会更小)。完全可以找到Kevin Wright’s AutoProxy plugin.该插件旨在解决代理问题,以及其他用例(包括动态混合): class FooProxy(@proxy val self: Foo) { ... } 不幸的是,它似乎在11月(2009年)停滞不前。所以我的问题是 > AutoProxy插件还在继续工作吗? 解决方法
四个问题,四个答案
>我是,虽然家庭必须先到!另外还有其他人参与编译器插件中综合方法的一般问题。>如果是这样,它很有可能是一种不同的形式,也许没有使用注释。>我不知道任何等效的插件,虽然其中一个Scala GSOC候选项目部分基于我的自动代码。然而,有一个非常干净的解决方案在大多数情况下可以工作,并且根本不需要编译器插件:您定义从FooProxy到Foo的隐式转换,它只返回自身成员;这样会让你得到最大的方式。该方法的主要问题是,如果您需要使用Java的代码,那么它将使生活变得更加困难,在速度/内存方面可能效率较低,这是您必须注意的另一个原因。>令人沮丧的部分是几乎所有必要的逻辑已经在编译器中可用,它用于混合,所以真的应该是一个优雅的处理任务的方式。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |