假设您希望在使用varargs调用方法时使用模式匹配:
def foo(bar: Int*) = ???
val x = false
foo(x match {
case true => 1
case _ =>
})
运行上面的代码会导致类型不匹配错误,因为foo
需要Int
类型的参数,但在默认情况下找到Unit
。另一方面,删除默认情况会导致警告表明匹配可能并非详尽无遗,而且理所当然。
我的问题是,如何为匹配提供空默认情况(这会导致调用foo()
而没有任何参数)?
答案 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了。