2011-06-28 13 views
13

オブジェクトL1以下のとおりです。 varargsを渡すことでL1を作成することはできますが、これは同じ構文を使用してL1に割り当てることができます。残念ながら、私がここでやったやり方は、の中に入れ子の醜い構文が必要です。。Scala - 返されたvarargsを適用解除できますか?

object L2 { 
    def apply(stuff: String*) = stuff.mkString(",") 
    def unapply(s: String) = Some(s.split(","):_*) 
} 
val x2 = L2("4", "5", "6") 
val L2(d,e,f) = x2 
println("d=%s, e=%s, f=%s".format(d,e,f)) 

しかし、これはエラーを与える:

object L1 { 
    def apply(stuff: String*) = stuff.mkString(",") 
    def unapply(s: String) = Some(s.split(",")) 
} 
val x1 = L1("1", "2", "3") 
val L1(Array(a, b, c)) = x1 
println("a=%s, b=%s, c=%s".format(a,b,c)) 

は、私は以下のL2のように、明らかな方法のように思える何でこれを実現しようとし

error: no `: _*' annotation allowed here 
(such annotations are only allowed in arguments to *-parameters)`. 

unapplyがすることが可能ですこのようにvarargsを使用しますか?

答えて

21

私はあなたが望むものはunapplySeqだと思います。 Jesse Eicharは素晴らしい記事を書いていますunapplySeq

scala> object L2 { 
    |  def unapplySeq(s: String) : Option[List[String]] = Some(s.split(",").toList) 
    |  def apply(stuff: String*) = stuff.mkString(",") 
    | } 
defined module L2 

scala> val x2 = L2("4", "5", "6") 
x2: String = 4,5,6 

scala> val L2(d,e,f) = x2 
d: String = 4 
e: String = 5 
f: String = 6 
+0

完璧!ありがとう! – dhg

関連する問題