2016-10-21 12 views
2

私の現在のプロジェクトでは、単一の密閉された特性をサブクラス化する多くのケースオブジェクトを定義する必要があります。これらのオブジェクトの名前は、パターン、例えばCase1、Case2、Case3、...、CaseNを有する。私は、N行の定義を書くのではなく、ループを使って、これらすべての事例オブジェクトをプログラム的な方法で定義する方法がスカラーにあるかどうか疑問に思っていました。Scalaのcaseオブジェクトをプログラムで定義することは可能ですか?

可能であれば、コンパイル時にこれを実行して、このように定義されたcaseオブジェクトが型チェックを行うことがわかっているといいでしょう。これはほとんどの言語では不可能です(Pythonのような動的に定義された型を持つことも、C/C++のような静的型の安全性を持つこともできますが、どちらもできません)。

+0

しかし、なぜ、あなたはクラスを作成し、実行時にオブジェクトを作成しないのだろうか? –

+0

クラスのインスタンス、特に完全なパターンマッチングでパターンマッチングを行うことはできないためです。 – uraj

+0

クラスのいくつかのプロパティによるパターンマッチングはどうですか?プロパティのパターンを持つオブジェクトを作成し、そのプロパティで一致させます。 –

答えて

0

私はこの解決策を考えている:

trait customTrait{ 
    val property: String 
} 

case class toMatch(property: String) extends customTrait{ 
} 

val cases: Seq[toMatch] = for{ 
    x <- 0 until 10 
} yield toMatch("property" + x) 

def matchCase(caseToMatch: customTrait): String = caseToMatch match{ 

    case toMatch("property1") => "1" 
    case toMatch("property2") => "2" 
    case toMatch("property3") => "3" 
    case toMatch("property4") => "4" 
    case _ => "non" 

} 

for { 
    x <- cases 
} yield matchCase(x) 
+0

この部分コードは動作しますが、私が言ったように、あなたがマッチブロックに書いたケースで静的なチェックが欠けています。誰かが "property3"のようなケースを追加するのを忘れた場合、コンパイラは警告を出しません。一方、ワイルドカードの場合は、コンパイラは常に警告を出します。 – uraj

関連する問題