Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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 - Fatal编程技术网

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

Scala 当多个案例合并时,如何引用变量?,scala,Scala,当使用Scala中的match组合多个案例时,是否有方法为变量指定引用名称 代码: 假设Genderenum有三个可能的值,如male、female和other (nameOption, genderOption) match { case (Some(name), Some(Gender.Male)) | (Some(name), Some(Gender.FeMale))=> s"$name gender is either male or female" case (N

当使用
Scala
中的
match
组合多个案例时,是否有方法为变量指定引用名称

代码:

假设
Gender
enum有三个可能的值,如
male
female
other

(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
}
第一个案例
案例(一些(姓名),一些(性别.男性))|(一些(姓名),一些(性别.女性))
是编译器错误,因为
名称
已在范围中定义


如果我在实际代码中不合并案例,圈复杂度就会增加

您可以尝试以下方法

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

}

你可以试试下面的方法

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

}

您可以将第一个案例替换为:

case (Some(name), Some(Gender.Male) |  Some(Gender.FeMale))=> s"$name gender is either male or female"
更新-更好-感谢@Astrid

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

您可以将第一个案例替换为:

case (Some(name), Some(Gender.Male) |  Some(Gender.FeMale))=> s"$name gender is either male or female"
更新-更好-感谢@Astrid

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

除了已经给出的答案之外,如果发现在代码的不同部分重复了<代码>性别>男性>性别>女性< /代码>匹配子句,您可能需要考虑一个自定义提取器。

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
  ...
}

除了已经给出的答案之外,如果发现在代码的不同部分重复了<代码>性别>男性>性别>女性< /代码>匹配子句,您可能需要考虑一个自定义提取器。

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
  ...
}

如果你把
(一些(名字),一些(性别,其他))
放在第一位,那么你就可以使用
(一些(名字),)
。作为一般规则,请将最具体的情况放在第一位,以便以后可以使用catch all matches。Scala不允许使用这种语法,因为
名称
已复制。而是使用有关如何获取元组值的公式。类似这样的情况<代码>案例五:(a@Option[字符串],一些(性别.男性))|(b@Option[String],一些(Gender.FeMale))或
案例v@(a@Option[字符串],一些(性别.男性))|(b@Option[String],一些(Gender.FeMale))
。和(取决于您的逻辑),您可以在匹配之前将可选性
.getOrElse
放在一边。如果您将
(一些(名称),Some(Gender.Other))
首先,您可以使用
(Some(name),)
。作为一般规则,请将最具体的情况放在第一位,以便以后可以使用catch all matches。Scala不允许使用这种语法,因为
名称
已复制。而是使用有关如何获取元组值的公式。类似这样的情况<代码>案例五:(a@Option[字符串],一些(性别.男性))|(b@Option[String],一些(Gender.FeMale))或
案例v@(a@Option[字符串],一些(性别.男性))|(b@Option[String],一些(Gender.FeMale))
。和(取决于您的逻辑),在匹配之前,您可以
.getOrElse
去掉可选性。是的,这取决于具体情况。我的目的只是演示如何通过使用name变量来实现相同的事情。当然还有改进的余地。这取决于具体情况。我的目的只是演示如何通过使用name变量来实现相同的事情。当然,对于
案例(一些(姓名),一些(Gender.Male | Gender.femal))
或者甚至对于
案例(一些(姓名),一些(Gender.Male | Gender.femal))