比方說,我有這些類:Implicits,PIMPL模式等
case class A()
case class B()
case class C(a: A, b: B)
和這些變量:
val a = A()
val b = B()
有沒有辦法讓C
實例含蓄,也沒有留下a
和b
隱式vals?即如果我有一個方法,期待一個C
:
def foo(c: C)
比方說,我有這些類:Implicits,PIMPL模式等
case class A()
case class B()
case class C(a: A, b: B)
和這些變量:
val a = A()
val b = B()
有沒有辦法讓C
實例含蓄,也沒有留下a
和b
隱式vals?即如果我有一個方法,期待一個C
:
def foo(c: C)
的case class A
符號已被否決。您必須使用case class A()
,否則將A
分配給val a
將導致a
引用在場景後面生成的案例類別A
的伴隨對象。
這是我的理解,你想要a
引用案例類的實例,而不是伴侶對象。
如果是這樣,你要問是可能的 - a
和b
不必是隱含的,但你必須添加一個新的隱式方法引入範圍:
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
「Pimpl」是一個C++ ism - 它意味着「指向實現」,並且是一種避免在頭文件中暴露類實現細節的方法,主要是爲了提高編譯速度。你可能意思是「皮條客我的圖書館」,它是一個Scalaism,意思是「當你無法修改源代碼時,用implicits向圖書館添加東西」。 –