2011-09-01 16 views

答えて

7

この問題は何ですか?

def m(a: A) = a match { 
    case b: B => print("B") 
    case c: C => print("C") 
} 

これ以上の機能を要求していないため、私は尋ねるだけです。

EDIT

これは助けることができる:

object Dog { 
    def apply(name: String)(size: Int) = new Dog(name)(size) 
    def unapply(dog: Dog) = Some(dog.name, dog.size) 
} 
class Dog(val name: String)(var size: Int) 

は今、あなたはどちらか、このような犬を作成することができます:

Dog("Snoopy")(10) 
0:
new Dog("Snoopy")(10) 

または、このようなしかし、あなたが犬にパターンマッチするとき、コンストラクタパターンはではなく、がカレーされています。 unapply(x$0: Q): Option[Int]:あなたは、クラスBのために作成適用解除する機能の署名を見れば

Dog("Snoopy")(10) match { 
    case Dog(a, b) => // do sth with a or b 
} 
+0

あなたの最初の例はうまくいくでしょうが、醜い型キャストをしなくてもcase文のB.aとB.bにアクセスすることはできません。また、あなたの編集では、なぜコンストラクタパターンがカレー化されていないのか分かりません。それは適用されないためですか? –

+0

正直言って私はそれがなぜ機能するのか分かりません。私は試行錯誤してそれを見つけた。これはScala仕様のどこかで言及されています。あなたのケースでそれが適切であれば、それを見たいかもしれません。 – agilesteel

+1

はい、caseステートメントで使用するパターンは、una​​pply関数の結果で指定されたパターンです。それは決してカレー化することはできません。スカラ仕様の対応するセクションは、8.1.8 – Nicolas

2

通常のケースクラスを使用して、複数のパラメータリストを持つファクトリメソッドを定義することができます。

+0

コンパニオンオブジェクトで宣言されている場合は、ファクトリメソッドは「適用」できません(これは、 eはケースクラスのおかげで宣言されました)。 – Nicolas

11

、あなたはそれがあることがわかります。したがって、未適用関数は、ケースクラスのパラメータの最初の範囲で機能します。

Scalaの仕様(§5.3.2)によって確認された:ケースクラス の第1のパラメータセクションで仮パラメータを要素と呼ばれ

。彼らは特別に扱われます。まず、そのようなパラメータの値をコンストラクタパターンのフィールドとして抽出することができる。 。

第1パラメータセクションのみがエクストラクタを介して利用可能であることが明らかです。

いくつかの回避策:

  • あなたは2つの値をテストしたい場合はガードとのパターンマッチングを使用
  • あなたのパラメータuncurry: case [email protected](3) if x.b == "bazinga" => ...
  • は、通常のクラスを使用すると、あなたとあなた自身のコンパニオンオブジェクトを定義します
関連する問題