假设:
scala> case class ParentPath(private val x: String) {
| val value = x.dropWhile(_ == '/')
| }
我可以制作ParentPath
:
scala> ParentPath("/foo")
res10: ParentPath = ParentPath(/foo)
我无法访问其x
(由于private
,它出现了)。
scala> res10.
asInstanceOf canEqual copy isInstanceOf productArity productElement productIterator productPrefix toString value
我可以获得value
。
scala> res10.value
res11: String = foo
但是,我希望在模式匹配时返回value
而不是x
:
scala> res10 match { case ParentPath(x) => x}
res13: String = /foo
如何与value
而不是x
进行模式匹配?
scala> ParentPath.unapply(res10)
res15: Option[String] = Some(/foo)
我试图覆盖ParentPath#unapply
,但遇到了编译时错误:
scala> case class ParentPath(private val x: String) {
| val value = "foo"
| override def unapply(p: ParentPath): Option[String] = Some(value)
| }
<console>:15: error: method unapply overrides nothing
override def unapply(p: ParentPath): Option[String] = Some(value)
^
答案 0 :(得分:3)
unapply
方法属于伴随对象,无论如何都无法覆盖案例类。对于普通班级,这将有效。 或,如果您只是使用具有相同签名的unapply
方法的不同命名对象。
class ParentPath(private val x: String) {
val value = "foo"
}
object ParentPath {
def unapply(p: ParentPath): Option[String] = Some(p.value)
}
scala> new ParentPath("/foo") match { case ParentPath(x) => x }
res1: String = foo