0

Scala で内部 DSL を構築しようとしています。私は次のタイプを持っています:

case class A(name:String)
case class Group(list:A*) // it can also be list:List[A]

通常の構文を使用して A のグループを作成するには、次のようにします。

val group1 = Group(A("a1"), A("a2"), ...)

これはかなり醜いです。(A("a1"), A("a2"), ...)可能であれば、グループを として、場合によっては後で紹介したいと思い("a1", "a2", ...)ます。

(A("a1"), A("a2"), ...)に変換する方法を自分で理解できませんでしたGroup(A("a1"), A("a2"), ...)(A("a1"), A("a2"), ...)クラス Group のインスタンスに変換できればいいのですが。(内部の A の数を無制限に指定できなくてもかまいません。最大 8 つの A で十分です)

だから私の質問は:タプルをクラスの特定のインスタンスに変換する方法はありますか? そうでない場合、この問題をどのように解決しますか?

4

1 に答える 1

1

まず第一に、タプル クラスが異なるため、Scalaで任意のアリティのタプルに対して何かを解決するのは面倒です。変換をサポートするには、8 または 22 または任意のアリティが必要です。

とにかく、タプルは異種の型のもののためのものですが、ここでは共通の型のコレクションが必要です。したがって、タプル構文は見栄えがするかもしれませんが、DSL でこの場合に使用しないことをお勧めします。コレクションに固執するかGroup、追加の文字を犠牲にしてでも、タイプにエイリアスを付けるだけです。

object A {
  implicit def fromString(name: String) = A(name)
}
case class A(name: String)
case class Group(elem: A*)

val G = Group
G("a1", "a2")

本当にタプルをサポートしたい場合は、次のようにします。

object Group {
  implicit def fromTuple2[A1 <% A, A2 <% A](t: (A1, A2)) = Group(t._1, t._2)
}
case class Group(elem: A*)

("a1", "a2"): Group
于 2013-01-25T22:08:06.890 に答える