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))