Scala — обозначение соответствующего элемента в сопоставлении с образцом

У меня есть следующий код:

class Animal(hair: Option[Hair])

class Cat(var hair: Option[Hair]) extends Animal(hair)
class Dog(var hair: Option[Hair]) extends Animal(hair)
class Sheep(var hair: Option[Hair]) extends Animal(hair)

//then somewhere else:

def what(animal: Animal) {

  animal match {
    case Cat(hair) => println("processing cat, hair=" + hair)
    case Dog(hair) => println("processing dog, hair=" + hair)
    case Sheep(hair) => {
      println("processing sheep, cutting hair...")
      hair = None
    }
  }
}

Вопросы таковы:

1) Когда сопоставление с образцом успешно выполняется с овцой, как я могу получить доступ к ее волосам и изменить их? Он пожаловался на переназначение val, и затем я поместил varв конструктор, но все же...

2) Еще один способ, который я могу придумать, - это присвоить все совпадающее значение переменной, есть ли способ привязать значение, соответствующее некоторому шаблону конструктора класса case, к переменной?

(Я знаю, что, вероятно, мог бы сопоставить что-то вроде s: Sheep, а затем вызвать s.changeHairTo(None), но это наименее предпочтительный способ).

8
задан paradigmatic 10 March 2012 в 09:16
поделиться