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 回答