Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala varargs的默认空大小写_Scala_Pattern Matching_Variadic Functions - Fatal编程技术网

Scala 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(),而不使

假设您希望在使用varargs调用方法时使用模式匹配,如下所示:

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+个值),它甚至可以保证自己的方法保持干净。但很明显,我们并没有看到全部情况。