scala.MatchError:<SomeStringvalue>(类java.lang.String)

use*_*227 1 scala

我收到了错误:

Exception in thread "main" scala.MatchError: SomeStringValue (of class java.lang.String)
Run Code Online (Sandbox Code Playgroud)

我发现这是因为"SomeStringValue"在任何情况下都不存在:

val test = "SomeStringValue"
test match {
  case "Name" => println("Name")
  case "Age"  => println("Age")
  case "Sex"  => println("Sex")
}
Run Code Online (Sandbox Code Playgroud)

当我添加了else case:_它正确运行如下.

val test = "SomeStringValue"
test match {
  case "Name" => println("Name")
  case "Age"  => println("Age")
  case "Sex"  => println("Sex")
  case _      => println("Nothing Matched!!")
}
Run Code Online (Sandbox Code Playgroud)

问题:Scala中的case构造中应该始终存在匹配值的原因是什么?

Cyr*_*pet 8

match构建体是在本身的表达式.

假设,println你有整数,而不是有语句,那么整个块将是一个类型的值Integer:

val test = "SomeStringValue"
val count: Int = test match {
  case "Name" => 1
  case "Age"  => 2
  case "Sex"  => 3
}
Run Code Online (Sandbox Code Playgroud)

现在,应该count是什么价值?这就是match声明必须处理所有可能情况的原因.

在某些情况下(例如与a sealed trait或模式匹配时sealed abstract class),编译器将能够给你一个警告,但大多数时候,错误将在运行时抛出,所以你真的需要小心它.