Scala varargs的默认空大小写
假设您希望在使用varargs调用方法时使用模式匹配,如下所示:Scala varargs的默认空大小写,scala,pattern-matching,variadic-functions,Scala,Pattern Matching,Variadic Functions,假设您希望在使用varargs调用方法时使用模式匹配,如下所示: def foo(bar: Int*) = ??? val x = false foo(x match { case true => 1 case _ => }) 运行上述代码会导致类型不匹配错误,因为foo需要类型为Int的参数,但在默认情况下找到的却是Unit。另一方面,删除默认情况会导致警告,指出匹配可能并不详尽,这是理所当然的 我的问题是,如何为匹配提供一个空的默认情况(这将导致调用foo(),而不使
def foo(bar: Int*) = ???
val x = false
foo(x match {
case true => 1
case _ =>
})
运行上述代码会导致类型不匹配错误,因为foo
需要类型为Int
的参数,但在默认情况下找到的却是Unit
。另一方面,删除默认情况会导致警告,指出匹配可能并不详尽,这是理所当然的
我的问题是,如何为匹配提供一个空的默认情况(这将导致调用
foo()
,而不使用任何参数)?您可以按顺序捕获匹配结果,并将缺少参数的情况表示为空。然后将结果显示到参数中:
val x = true
foo((x match {
case true => Seq(1)
case _ => Seq.empty
}):_*)
一种选择是使用
选项[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)
我认为,如果你在一个
布尔值上进行匹配,那么传递varargs根本没有意义。如果你只传递一个Int
,为什么要使用varargs?@YuvalItzchakov给出的例子是一个MWE,如果这个MWE不是你真正的问题,那么实际的用例会更复杂,我们可能无法提供最佳解决方案,因为我们只看到了实际问题的“近亲”。@YuvalItzchakov没有太多细节,我有一个接受varargs的方法。我需要以三种不同的方式调用此方法:不带任何参数、带一个参数或带多个参数。为了决定使用哪个参数调用我的方法,我对一个变量进行模式匹配,这个变量有20多个不同的可能值,但我只对其中的几个感兴趣。在其他情况下,我希望不带任何参数调用我的方法。希望这能澄清一些问题,因为val args=x match。。。;foo(args:*)
。当然是。如果它像OPs评论建议的那样复杂(20+个值),它甚至可以保证自己的方法保持干净。但很明显,我们并没有看到全部情况。