をマッチング:スカラ - のパターンでマッチしたアイテムの指定、私は次のコードを持っている
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)私が考えてもいいもう一つの方法は、一致した値全体を変数に代入することです。いくつかの大文字と小文字のクラスコンストラクタパターンによってマッチした値を変数にバインドしますか?
(私はおそらくs: Sheep
のようなものにパターンマッチしてから、s.changeHairTo(None)
と呼ぶことができますが、それは最も好ましからざる方法です)。
これは機能しますが、私は4e6の最初のブロックを使用する方がよいでしょう。ケースステートメントの中で、「羊」を扱っていることを知っているので、すべての「動物」が変更可能な髪を扱わなければならないという要件はありません。一般的に言えば、変更を最小限に抑えることは良いことです。代替アプローチでは、猫や犬にも変わらない髪ができます。 –
私は両方の点であなたに完全に同意します。しかし、彼の猫と犬のクラスはすでに変更可能な髪のフィールドを持っています;-) – drexin