2012-03-30 99 views
7

给出一个数组类型阶元组类型组成

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)),这是不同的。

感谢

回答

5

在我看来有元组没有这样的构造,但HList有非常相似的一个你表现出的行为。它们被认为具有高级类型的编程结构,根据您想要实现的功能,使用起来可能很困难。这里是excellent starternice implementation

9

您可以使用HList来从shapeless进行元组转换。

scala> import shapeless._ ; import Tuples._ 
import shapeless._ 
import Tuples._ 

scala> class MyClass ; val m = new MyClass 
defined class MyClass 
m: MyClass = [email protected] 

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) = ([email protected],foo,23,bar) 
+0

感谢Miles,非常有趣。问题是如何获得t2的类型并将其用于类定义?就像在上面的例子中,类TupleTypes [T]扩展AnotherClass [T1]'有无论如何得到T1? – mericano1 2012-03-31 16:25:19

+0

你可以给我一些你计划添加到'TupleTypes'和'AnotherClass'成员的一般形状的例子。你还可以说,如果你需要在'T'和'T1'之间有任何有用的关系(也就是说,你是否需要能够构造一个类型为'MyClass'的值为'T1'的值并且'T'和/或反之亦然)? – 2012-03-31 22:20:01

+0

Hi Miles,感谢您的帮助。我正在使用scalaquery,我想创建一个抽象基类,它有一个Long(id)类型的列。所以'TupleTypes [T]'实际上是'BaseTable [T]'。扩展'BaseTable [T]'的其他类将有列的列表,而'T'类型将是像'(String,Int,Boolean,Date)'这样的元组。现在,因为我的'BaseClass [T]'需要扩展标量表并为所有列类型提供一个元组,'T1'必须是'(Long,String,Int,Boolean,Date)'。希望这解释了我想要实现的。 – mericano1 2012-04-01 14:01:51

1

迟到了,但是,你正在寻求关于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 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踢不可思议的azz,Zeiger很棒! (如同Scala社区中的许多人一样,未来在Scala方式上看起来很光明;-))