scala元组类型组合
给定一个元组类型scala元组类型组合,scala,types,Scala,Types,给定一个元组类型 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))这是不同的 谢谢
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))这是不同的
谢谢在我看来,元组没有这样的构造,但是HList的行为与您展示的行为非常相似。它们被认为具有高级类型的编程结构,根据您想要实现的目标,使用起来可能会很困难。下面是一个和一个。您可以使用
HList
到元组的转换从
迟到,但如果您正在寻找有关ScalaQuery问题的“更好”解决方案,请尝试以下方法: 1) 创建ID为的映射器基类
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类/伴生对象扩展映射器库(即不基于元组)
然后,您可以执行以下操作:
def show: List[Foo] = {
val q = (for { f <- Foos } yield f)
val foos = db withSession {
foos.list map { case t:T => t }
}
render(foos)
}
def显示:列表[Foo]={
val q=(对于{f t}
}
渲染(foos)
}
并且有一个可导航的对象(与基于索引的元组相比)
现在,当您只需要一组实体中的字段子集时,有时您不需要一个庞大的对象图
这就是投影的用武之地,只需创建一个case类,该类表示所需的字段集,然后创建一个可导航投影对象:
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)
}
case类Yum(foo:String,baz:String)
def显示:列表[Yum]={
val q=(对于{f感谢迈尔斯,非常有趣。问题是如何获取t2的类型并将其用于类定义?就像上面的示例class TupleTypes[T]扩展了另一个类[T1]
还有什么方法可以得到T1吗?你能给我一些你打算添加到TupleTypes
和AnotherClass
中的成员的一般形状的例子吗?你能不能说你是否需要在T
和T1
之间建立某种有用的关系(即,您是否需要能够构造类型为T1
的值以及类型为MyClass
和T
的给定值,或者反之亦然)?您好,迈尔斯,我感谢您的帮助。我正在使用scalaquery,我想创建一个具有Long(id)类型列的抽象基类。因此TupleTypes[T]
实际上是BaseTable[T]
。扩展BaseTable[T]
的其他类将有一个列列表,类型T
将是一个类似(String,Int,Boolean,Date)
的元组
需要扩展scalaquery表并提供包含所有列类型的元组,T1
必须是(Long、String、Int、Boolean、Date)
。希望这能解释我想要实现的目标。
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)
}