[英]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.