2011-02-23 32 views
3

比方說,我有這些類:Implicits,PIMPL模式等

case class A() 
case class B() 
case class C(a: A, b: B) 

和這些變量:

val a = A() 
val b = B() 

有沒有辦法讓C實例含蓄,也沒有留下ab隱式vals?即如果我有一個方法,期待一個C

def foo(c: C) 
+2

「Pimpl」是一個C++ ism - 它意味着「指向實現」,並且是一種避免在頭文件中暴露類實現細節的方法,主要是爲了提高編譯速度。你可能意思是「皮條客我的圖書館」,它是一個Scalaism,意思是「當你無法修改源代碼時,用implicits向圖書館添加東西」。 –

回答

6

case class A符號已被否決。您必須使用case class A(),否則將A分配給val a將導致a引用在場景後面生成的案例類別A的伴隨對象。

這是我的理解,你想要a引用案例類的實例,而不是伴侶對象。

如果是這樣,你要問是可能的 - ab不必是隱含的,但你必須添加一個新的隱式方法引入範圍:

implicit def obtainC = new C(a, b) 

然後,必須把implicit修飾符c的方法foo

def foo(implicit c: C) 

完整的會話:

scala> case class A() 
defined class A 

scala> case class B() 
defined class B 

scala> case class C(a: A, b: B) 
defined class C 

scala> val a = A() 
a: A = A() 

scala> val b = B() 
b: B = B() 

scala> implicit def obtainC = new C(a, b) 
obtainC: C 

scala> def foo(implicit c: C) = {} 
foo: (implicit c: C)Unit 

scala> foo 
+0

謝謝!我知道有關案例類語法的問題。我只是懶得把它們正確地打印出來。我的不好;) – chrsan

+0

沒問題。我只是指出了,因爲我不確定你是否希望'a'和'b'真的指向伴侶對象。 :) – axel22

+2

對於案例類A()點,如果對象沒有數據,它實際上是個案對象A的好候選者(類似於空列表的Nil)。使它成爲一個case對象仍然給你equals,hashCode和toString,並且當它是其他case類的一部分時,保持A「統一」。 –