2010-12-10 115 views
1

是否有可能重構以下內容?重構複製功能

case class Foo(
    a: List[String]) { 
    def +(s: String) = copy(a = s :: a) 
    } 

    case class Bar(
    a: List[String], 
    b: Int) { 
    def +(s: String) = copy(a = s :: a)  
    } 
+0

以什麼方式?什麼似乎是問題? – 2010-12-10 16:44:30

+0

@Daniel重複'def +(s:String)= copy(a = s :: a)', 我想 – 2010-12-10 16:49:41

+0

重複的代碼。本身不是問題。 – 2010-12-10 17:14:30

回答

1

copy不能被提取到超一流的(如果這是你在找什麼) - 這是一個編譯器生成的方法。

+0

我意識到這一點,但是想知道是否可以採取其他方法來糾正這種情況下的重複。 – 2010-12-10 17:15:43

1

與反射的一個巨大的量可以做到這一點,在一個有些脆弱方式中,通過使用(未記錄的)copy$default$1方法,以及匹配的類型關閉copy方法,以及具有執行的性狀,包括def a: List[String]def a_=(a0: List[String])。但這是一個糟糕的主意;支持並不完全存在(例如,如果您將它混合到非案例類中,它將在運行時失敗),速度很慢,並且只節省少量的輸入。

如果您有一個可以節省大量打字的情況,我鼓勵您使用代碼生成代替(即編寫Scala代碼的Scala代碼)並附加一個用於編譯的傳遞。