0

私は Scala を初めて使用します。必要なのは、次のようなパターン マッチング関数に基づいて動的型のように作成することです。

type defType = "value1" match {
  case "value0" => typeOf[String]
  case "value1" => typeOf[Integer]
  case _ => typeOf[Double]
}

val test5 : defType = 4

これは、より複雑な構造を扱う場合の単なる例ですが、やりたいことのアイデアを提供します。

4

2 に答える 2

1

基本的な概念上の理由から、これは不可能だと思います。型ルールはコンパイル時にチェックされるため、実行時まで不明な値に基づいて型を派生させることはできません。

そうは言っても、それぞれが特定の型の値のラッパーであるケースクラスのファミリーを定義することで、設計上の問題に取り組むことができるかもしれません。これらのクラスに共通の基底クラスを与えることで、任意の型の値を同じ変数に格納し、型安全なパターン マッチングによって抽出できます。

class Base
case class AString(val value: String) extends Base
case class AnInt(val value: Int) extends Base
case class ADouble(val value: Double) extends Base

val a : Base = "value1" match {
  case "value0" => AString(…)
  case "value1" => AnInt(…)
  case "value0" => ADouble(…)
}

a match {
  case AString(s) => …
  case AnInt(i) => …
  case ADouble(i) => …
  …
}
于 2013-07-28T18:01:12.033 に答える
1

私はおそらくあなたが何をしているのか理解していませんが、これは私には問題があるようです:

val test5 : defType = 4

コンパイラはコンパイル時defTypeに知ることができる必要があります。そうしないと、型チェックができません。それを踏まえて、 Scala マクロを利用して、コンパイル時にこのパターン マッチングを行いたいと思います。

ただし、このシナリオ全体が非常に奇妙に見えるという理由だけで、それは正しい解決策ではないと感じています。あなたがやろうとしていることの全体像について詳しく教えていただければ、より良い解決策を提案できるかもしれません。

于 2013-07-28T18:05:38.777 に答える