Scala 在可能值的子集上进行匹配时避免匹配错误
我想知道是否有可能在不抛出Scala 在可能值的子集上进行匹配时避免匹配错误,scala,pattern-matching,Scala,Pattern Matching,我想知道是否有可能在不抛出MatchError的情况下匹配可能值的子集 def foo(bar: String): Int = bar match { case "x" => 0 case "y" => 1 case _ => -1 } 在上面的示例中,我理解您必须匹配所有可能的值,因为该方法必须返回某些内容 def foo(bar: String): Unit = { bar match { case "x" => is
MatchError
的情况下匹配可能值的子集
def foo(bar: String): Int = bar match {
case "x" => 0
case "y" => 1
case _ => -1
}
在上面的示例中,我理解您必须匹配所有可能的值,因为该方法必须返回某些内容
def foo(bar: String): Unit = {
bar match {
case "x" => isX()
case "y" => isY()
}
}
然而,在上面的示例中,我觉得没有必要匹配所有可能的值,因为该方法不依赖于匹配的结果,因为它只调用方法。如果bar
是除“x”或“y”之外的某个值,则会抛出MatchError
,这非常烦人,要避免这种情况,需要添加一个无意义的case
子句
如果您只想做一些事情,而不是返回一些东西,而不必匹配所有可能的值,那么它将更加方便和简洁。这是可能的吗?所以您想要的是一个局部函数,其中匹配失败不起任何作用。这几乎就是收集的定义,只是我们没有收集。这很容易修复,导致
def foo(bar: String): Unit = {
Some(bar) collect {
case "x" => isX()
case "y" => isY()
}
}
这就是你想要的。因此,你想要的是一个局部函数,其中匹配失败不起任何作用。这几乎就是收集的定义,只是我们没有收集。这很容易修复,导致
def foo(bar: String): Unit = {
Some(bar) collect {
case "x" => isX()
case "y" => isY()
}
}
Scala是一种函数式语言,所以从技术上讲,您总是返回一些东西,
Unit
有一个值()
,这就是您返回的值。你建议对不同的返回类型使用不同的语法?@VictorMoroz很好。这可能是一种选择。Scala是一种函数式语言,所以从技术上讲,您总是返回一些东西,Unit
有一个值()
,这就是您返回的值。你建议对不同的返回类型使用不同的语法?@VictorMoroz很好。这可能是一种选择。它如何比case\u=>
更好?我认为case\u=>
的使用更明确,工作量更少。它不一定“更好”,但是,解决OP的问题并证明它是可能的。它如何比case\u=>
更好?我认为使用case\u=>
更明确,工作量更少。它不一定“更好”,但它确实解决了OP的问题并证明它是可能的。