假设我想使用相同的代码处理来自远程服务的多个返回值。我不知道如何在Scala中表达这一点:
code match {
case "1" => // Whatever
case "2" => // Same whatever
case "3" => // Ah, something different
}
我知道我可以使用Extract Method并调用它,但是在调用中仍然会重复。如果我使用Ruby,我会这样写:
case code
when "1", "2"
# Whatever
when "3"
# Ah, something different
end
请注意,我简化了示例,因此我不想在正则表达式上进行模式匹配等。匹配值实际上是复数值。
答案 0 :(得分:140)
你可以这样做:
code match {
case "1" | "2" => // whatever
case "3" =>
}
请注意,您无法将模式的某些部分绑定到名称 - 您目前无法执行此操作:
code match {
case Left(x) | Right(x) =>
case null =>
}
答案 1 :(得分:1)
The other answer 正确地说,目前没有办法在同时提取值的同时对多个备选方案进行模式匹配。 我想与您分享一个与此类似的编码模式。
Scala 允许您对替代项进行模式匹配 提取值,例如case Dog(_, _) | Cat(_, _) => ...
是合法的。使用它,您可以简单地自己在 case 块中提取值。
这是一个有点人为的例子:
abstract class Animal
case class Dog(age: Int, barkLevel: Int) extends Animal
case class Cat(apparentAge: Int, cutenessLevel: Int) extends Animal
val pet: Animal = Dog(42, 100)
// Assume foo needs to treat the age of dogs and the apparent age
// of cats the same way.
// Same holds for bark and cuteness level.
def foo(pet: Animal): Unit = pet match {
case animal@(Dog(_, _) | Cat(_, _)) =>
// @unchecked suppresses the Scala warning about possibly
// non-exhaustiveness even though this match is exhaustive
val (agelike, level) = (animal: @unchecked) match {
case Dog(age, barkLevel) => (age, barkLevel)
case Cat(apparentAge, cutenessLevel) => (apparentAge, cutenessLevel)
}
???
}
假设 ???
实际上代表做一些对狗和猫来说平等的事情。如果没有这种编码模式,您将需要有两种情况,一种用于狗,一种用于猫,这将迫使您复制代码或至少将代码外包到一个函数中。
通常,如果您的同级 case 类共享具有相同行为的字段仅适用于某些算法,则上述编码模式是合适的。在这些情况下,您无法将这些字段提取到公共超类。尽管如此,您还是希望以统一的方式对算法中对它们一视同仁的字段进行模式匹配。您可以按照上图所示执行此操作。