合并多个案例时如何引用变量?

Pun*_*y V 1 scala

当使用matchin 组合多个案例时,是否可以给变量赋予引用名称Scala

码:

假设Gender枚举有一个像三个可能的值malefemaleother

(nameOption, genderOption) match {
    case (Some(name), Some(Gender.Male)) | (Some(name), Some(Gender.FeMale))=> s"$name gender is either male or female"
    case (None, Some(Gender.Male)) | (None, Some(Gender.FeMale)) => //some print statement
    case (Some(name), Some(Gender.Other)) =>  //some print statement
    case _ => //some print statement
}
Run Code Online (Sandbox Code Playgroud)

第一种情况case (Some(name), Some(Gender.Male)) | (Some(name), Some(Gender.FeMale))name在范围中已经定义的编译器错误。

如果在我的实际代码中不合并案例,则循环复杂性会增加。

Gal*_*aor 8

您可以将第一种情况替换为:

case (Some(name), Some(Gender.Male) |  Some(Gender.FeMale))=> s"$name gender is either male or female"
Run Code Online (Sandbox Code Playgroud)

更新-更好-感谢@Astrid

case (Some(name), Some(Gender.Male | Gender.FeMale)) => s"$name gender is either male or female"
Run Code Online (Sandbox Code Playgroud)

  • 甚至是大小写(Some(name),Some(Gender.Male | Gender.FeMale))` (3认同)

Dio*_*Nt. 7

您可以尝试以下

(nameOption, genderOption) match {
    case (Some(name), Some(gender) if (gender == Gender.Male || gender == Gender.Female) => s"$name gender is either male or female"

}
Run Code Online (Sandbox Code Playgroud)

  • 也许“如果性别!=其他”更清晰 (2认同)

Ast*_*rid 6

除了已经给出的答案之外,如果您发现自己Gender.Male | Gender.FeMale在代码的不同部分重复了match子句,则可能需要考虑使用自定义提取器。

object BinaryGender {
  def unapply(gender: Gender.Gender) : Option[Gender.Gender] = {
    Some(gender).filter(_ != Gender.Other)
  }
}

(nameOption, genderOption) match {
  case (Some(name), Some(BinaryGender(_))) => s"$name gender is either male or female"
  case (None, Some(BinaryGender(_))) => //some print statement
  ...
}
Run Code Online (Sandbox Code Playgroud)