隐含,pimpl模式等

chr*_*san 3 scala

假设我有这些课程:

case class A()
case class B()
case class C(a: A, b: B)
Run Code Online (Sandbox Code Playgroud)

和这些变量:

val a = A()
val b = B()
Run Code Online (Sandbox Code Playgroud)

有没有办法C隐式地获取一个实例而没有制作ab隐式的val?即如果我有一个方法期望C:

def foo(c: C)
Run Code Online (Sandbox Code Playgroud)

axe*_*l22 6

case class A表示法已弃用.你必须使用case class A(),否则分配Aval a将导致a参照案例类的同伴对象A,其幕后产生.

我的理解是你想要a引用case类的实例,而不是伴随对象.

如果是这样,您所要求的是可能的 - a并且b不必是隐式的,但您必须在范围中添加新的隐式方法:

implicit def obtainC = new C(a, b)
Run Code Online (Sandbox Code Playgroud)

然后,您必须将implicit修改器c放在方法中foo:

def foo(implicit c: C)
Run Code Online (Sandbox Code Playgroud)

完整课程:

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
Run Code Online (Sandbox Code Playgroud)

  • 在案例类A()点上,如果对象没有数据,它实际上是一个很好的候选者是案例对象A(类似于空列表的Nil).使它成为一个case对象仍然给你equals,hashCode和toString,并且当它是其他case类的一部分时保持A"统一". (2认同)