2012-03-30 97 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方式上看起來很光明;-))