给定元组类型
type T = (String, Int, String)
我有什么方法可以获得T1类型,其中T1将是
type T1 = (MyClass, String, Int, String)
我希望能够宣布像
这样的课程class TupleTypes[T] extends AnotherClass[T1]
注意:元组大小未知且
type T1 = (MyClass, T)
将不会返回我想要的内容,它将返回(MyClass,(String,Int,String)),这是不同的。
由于
答案 0 :(得分:9)
您可以使用HList
来转换来自shapeless的转化。
scala> import shapeless._ ; import Tuples._
import shapeless._
import Tuples._
scala> class MyClass ; val m = new MyClass
defined class MyClass
m: MyClass = MyClass@3859023a
scala> val t1 = ("foo", 23, "bar")
t1: (String, Int, String) = (foo,23,bar)
scala> val t2 = (m :: t1.hlisted) tupled
t2: (MyClass, String, Int, String) = (MyClass@3859023a,foo,23,bar)
答案 1 :(得分:5)
在我看来,元组没有这样的构造,但 HList 的行为与你展示的行为非常相似。它们被认为具有高级类型编程结构,根据您想要实现的目标,使用可能很困难。这是excellent starter和nice implementation。
答案 2 :(得分:1)
1)创建ID为
的mapper基类import org.scalaquery.ql.extended.{ExtendedTable => Table}
abstract class Mapper[T](table: String) extends Table[T](None, table) {
def id = column[Int]("id", O PrimaryKey)
}
2)使用case class / companion object 扩展mapper base (即不是基于元组的)
case class Foo (bar: String)
object Foos extends _Mapper[Foo]("foo") {
def foo = column[String]("foo")
}
然后你可以做类似的事情:
def show: List[Foo] = {
val q = (for { f <- Foos } yield f)
val foos = db withSession {
foos.list map { case t:T => t }
}
render(foos)
}
并有一个可导航的对象(与基于索引的元组相比)。
现在,当您只需要来自一组实体的字段子集时,有时您不需要庞大的对象图。
这就是投影的来源,只需创建一个表示您想要的字段集的案例类,瞧,可以使用的可导航投影对象:
case class Yum (foo: String, baz: String)
def show: List[Yum] = {
val q = (for { f <- Foos; b <- Bars; if f.id is b.fooID } yield (f.foo, b.baz))
val yums = db withSession {
yums.list map { case t:T => t }
}
render(yums)
}
相当简单,应该用蛋糕驱动DAO封装,但一般原则是:采取案例类/对象路径。
应该注意到ScalaQuery踢出令人难以置信的声音,Zeiger非常出色! (和Scala社区中的许多人一样,未来在Scala方式上看起来很明亮; - ))