2010-10-10 55 views

回答

12

代理服務器性狀提供用於創建代表了有用的基礎,但請注意,它僅提供了Anyequals,hashCodetoString)中方法的實現。您將不得不自己實施任何其他轉發方法。代理服務器通常用於與pimp-my-library pattern

class RichFoo(val self: Foo) extends Proxy { 
    def newMethod = "do something cool" 
} 

object RichFoo { 
    def apply(foo: Foo) = new RichFoo(foo) 
    implicit def foo2richFoo(foo: Foo): RichFoo = RichFoo(foo) 
    implicit def richFoo2foo(richFoo: RichFoo): Foo = richFoo.self 
} 

標準庫也包含了一組可用於創建收集代理(SeqProxySetProxyMapProxy等)有用的特徵。

最後,在scala-incubator中有一個編譯器插件(AutoProxy plugin),它將自動實現轉發方法。另見this question

+1

該插件的當前活動版本是autoproxy-lite:https://github.com/kevinwright/Autoproxy-Lite – 2011-04-21 09:33:56

3

看起來好像你需要使用Haskell的newtype類似的功能。

例如,以下Haskell代碼:

newtype Natural = MakeNatural Integer 
        deriving (Eq, Show) 

可以粗略地對應於以下Scala代碼:

case class Natural(value: Int) extends Proxy { 
    def self = value 
} 
+0

所以這基本上是創建代表的機器? – 2010-10-10 15:22:06

+0

@JensSchauder,是的。 – missingfaktor 2013-03-13 07:08:31