与私人领域匹配的模式

时间:2015-09-04 19:32:17

标签: scala

假设:

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)
                        ^

1 个答案:

答案 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