簡體   English   中英

在scala中匹配未知大小的元組

[英]Match a tuple of unknown size in scala

是否可以在不指定大小的情況下部分匹配tuple 例如,如果我有一個元組

val v = ( "Dr", "John","H", "Watson") 

我希望能夠做到這樣的事情:

v match { 
   case ( "Dr", : _*) => "What's up, Doc?"
   case ( "Mr", name,   :_*) =>  s"Welcome, Mr. ${name}"
   case _ => "Have we met?"
} 

這不編譯, :_*通常表示未確定數量的參數,但顯然不能在這種情況下使用。 我的想法是能夠將這個匹配器用於任何大於2的元組。我知道我可以先將v轉換為List (例如),只是想知道是否可以用tuple來實現它。

編輯 :我在網上找到的最多信息是這個討論 ,可以追溯到scala 2.8,所以我要用'不,你不能'回答。

元組是異構類型的結構。 因此,他們實現了productIterator特性,因此您可以:

v.productIterator.toList match { 
  case "Dr" :: _ => "What's up, Doc?"
  case "Mr" :: name :: _ =>  s"Welcome, Mr. ${name}"
  case _ => "Have we met?"
}

但是你的例子看起來真的想要一個Seq[String] 是否有任何理由希望使用元組?

這可以通過從元組到HLists 無形轉換來HLists

scala> import shapeless._
import shapeless._

scala> import Tuples._
import Tuples._

scala> val v = ( "Dr", "John","H", "Watson")
v: (String, String, String, String) = (Dr,John,H,Watson)

scala> v.hlisted match {
     |   case "Dr" :: _ => "What's up Doc?"
     |   case "Mr" :: name :: _ => s"Welcome, Mr. ${name}"
     |   case _ => "Have we met?"
     | }
res0: String = What's up Doc?

雖然在上面的示例中不可見,但請注意,在case子句中綁定的名稱可能會保留完整的靜態類型信息,例如,

scala> (23, "foo", true).hlisted match {
     |   case i :: s :: b :: HNil => if(b) i+s.length else 0
     |   case _ => -1
     | }
res1: Int = 26

試試這個:

case tuple:Product => {
    tuple.productIterator.toList match {
        case (head::rest) => ...

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM