2015-09-04 4 views
1

Дано:Pattern Matching с частным поле

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

ответ

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 
+0

'вы не можете переопределить его для класса case, так или иначе' О, так что это« последний »? –

+0

Он конфликтует с методом 'unapply', который пытается создать собеседник класса case. –