varargs的默认空案例

时间:2016-05-15 15:29:33

标签: scala pattern-matching variadic-functions

假设您希望在使用varargs调用方法时使用模式匹配:

def foo(bar: Int*) = ???

val x = false
foo(x match {
  case true => 1
  case _ =>
})

运行上面的代码会导致类型不匹配错误,因为foo需要Int类型的参数,但在默认情况下找到Unit。另一方面,删除默认情况会导致警告表明匹配可能并非详尽无遗,而且理所当然。

我的问题是,如何为匹配提供默认情况(这会导致调用foo()而没有任何参数)?

2 个答案:

答案 0 :(得分:3)

您可以在序列中捕获匹配结果,并将缺少参数表示为空参数。然后将结果splat到参数:

val x = true
foo((x match {
  case true => Seq(1)
  case _ => Seq.empty
}):_*)

答案 1 :(得分:2)

一种选择是使用Option[Int]代替Int

def foo(bar: Option[Int]*) = ???

val x = false
foo(x match {
  case true => Some(1)
  case _ => None
})

我认为if-else表达式在这里不那么冗长:

foo(if (x) Some(1) else None)

我认为,如果你匹配一个Boolean那么就没有必要通过varargs了。