case class Foo(x: Int, ys: Int*) { // We write our own toString because of SI-7735 override def toString = (x +: ys).mkString("Foo(", ", ", ")") } object Test { def f1(x: Any) = x match { case Foo(x) => true case _ => false } def f2(x: Any) = x match { case Foo(x, y) => true case _ => false } def f3(x: Any) = x match { case Foo(x, y, z) => true case _ => false } def f1seq(x: Any) = x match { case Foo(x, ys @ _*) => true case _ => false } def f2seq(x: Any) = x match { case Foo(x, y, zs @ _*) => true case _ => false } def f3seq(x: Any) = x match { case Foo(x, y, z, qs @ _*) => true case _ => false } val x1 = Foo(1) val x2 = Foo(1, 2) val x3 = Foo(1, 2, 3) val fs = List[Any => Boolean](f1, f2, f3) val fseqs = List[Any => Boolean](f1seq, f2seq, f3seq) val xs = List[Foo](x1, x2, x3) def main(args: Array[String]): Unit = { for ((f, i) <- fs.zipWithIndex) { xs foreach (x => println(s"f${i+1}($x) == ${f(x)}")) println("") } for ((f, i) <- fseqs.zipWithIndex) { xs foreach (x => println(s"f${i+1}seq($x) == ${f(x)}")) println("") } } }