2010-06-01 42 views
1

被實例構造函數的參數創建類我想有類,可以用列表,陣列,序列被實例化,設置棧,隊列等 在我看來可以與單個或多個元素斯卡拉

class A 
class B(elems:A*) 

應該處理這樣的東西。

這是我的解決方案:

class A 
class B(elems:Iterable[A]){ 
    def this(elem:A) = this(Seq(elem)) 
} 

你可以提出任何改進?

+0

並不: class B(elems:A *) 是否有訣竅? – Thomas 2010-06-01 14:33:04

回答

10

任何序列或陣列可以通過使用: _*歸屬傳遞給一個方法反覆參數:

scala> def m1(strs: String*): Int = { strs.foldLeft(0)(_ + _.length) } 
m1: (strs: String*)Int 

scala> m1("foo", "bar") 
res0: Int = 6 

scala> val ss1 = Array("hello", ", ", "world", ".") 
ss1: Array[java.lang.String] = Array(hello, , , world, .) 

scala> m1(ss1: _*) 
res1: Int = 13 

scala> val ss2 = List("now", "is", "the", "time") 
ss2: List[java.lang.String] = List(now, is, the, time) 

scala> m1(ss2: _*) 
res2: Int = 12 
1

這可能是一個小改進。

class A 
class B(elems:Iterable[A]){ 
    def this(elem:A*) = this(elem.asInstanceOf[Iterable[A]]) 
} 

這會讓這些法律

val b1 = new B(a1) 
val b2 = new B(a2, a3) 
+0

你的意思是這個(elem:A *)= ... – Jeriho 2010-06-02 08:17:34

+0

@Jeriho:是的。我在REPL中用String測試了它 – sblundy 2010-06-02 12:30:13