Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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 在可能值的子集上进行匹配时避免匹配错误_Scala_Pattern Matching - Fatal编程技术网

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的问题并证明它是可能的。