加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

代理人/代表在Scala

发布时间:2020-12-16 09:31:35 所属栏目:安全 来源:网络整理
导读:我最近看到过几个Scala问题(例如 here, here和 here),它要求使用代理,而且在我自己的工作中出现了不止一次。 Scala库有许多代理特征(14,如果我正确计数)。 代理类/特征通常包含很多样板: class FooProxy(val self: Foo) extends Foo { // added behavio
我最近看到过几个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的一个显着的弱点?毕竟,是不是可以定义一个代理特征给定的lisp风格的宏?

解决方法

四个问题,四个答案

>我是,虽然家庭必须先到!另外还有其他人参与编译器插件中综合方法的一般问题。>如果是这样,它很有可能是一种不同的形式,也许没有使用注释。>我不知道任何等效的插件,虽然其中一个Scala GSOC候选项目部分基于我的自动代码。然而,有一个非常干净的解决方案在大多数情况下可以工作,并且根本不需要编译器插件:您定义从FooProxy到Foo的隐式转换,它只返回自身成员;这样会让你得到最大的方式。该方法的主要问题是,如果您需要使用Java的代码,那么它将使生活变得更加困难,在速度/内存方面可能效率较低,这是您必须注意的另一个原因。>令人沮丧的部分是几乎所有必要的逻辑已经在编译器中可用,它用于混合,所以真的应该是一个优雅的处理任务的方式。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读