当前位置: 首页 > 知识库问答 >
问题:

scala语法匹配多个案例类类型,而不分解案例类[重复]

邓星光
2023-03-14

我对各种case类实现有一个封闭的特性。我想为同一个匹配表达式同时对多个类进行模式匹配。我似乎不能不分解case类和它们之间的“|”

目前看起来像:

sealed trait MyTrait {
  val param1: String
  ...
  val param100: String
}

case class FirstCase(param1: String ...... param100: String) extends MyTrait
...
case class NthCase(param1: String ..... param100: String) extends MyTrait

代码中的另一个位置:

def myFunction(something: MyTrait) = {
   ...
   val matchedThing = something match {
      // this doesn't work with "|" character
      case thing: FirstCase | SecondCase => thing.param1
      ...
      case thing: XthCase | JthCase => thing.param10
   }
} 

共有2个答案

仲浩旷
2023-03-14

这对我有用https://scastie.scala-lang.org/pT4euWh6TFukqiuPr4T6GA:

sealed trait Sup {
  def a: String
  def i: Int
}

case class First(a: String, i: Int, d: Double) extends Sup

case class Second(a: String, i: Int, x: Seq[Double]) extends Sup

case class Third(a: String, i: Int, c: Char) extends Sup

val sups = Seq(First("s", 1, 1.0), Second("s", 4, Seq(1.1)), Third("s", 4, 'f'))

sups.foreach {
  case _: First | _: Second => println("ffff")
  case _                    => println("ggg")
}
吕俊美
2023-03-14

让我们一步一步地去那里:

>

  • |运算符,在模式匹配的上下文中,允许您以以下形式定义替代模式:

    pattern1 | pattern2
    

    如果要定义与类型匹配的模式,必须以以下形式提供该模式:

    binding: Type
    

    在两种不同类型之间进行选择时,应以以下形式提供:

    binding1: Type1 | binding2: Type2
    

    要将一个名称绑定到两个可选绑定,可以放弃单个绑定的名称(使用通配符),并使用@运算符将整个模式的名称绑定到另一个绑定,如下例所示:

    binding @ (_ : Type1 | _ : Type2)
    

    以下是一个例子:

    sealed trait Trait {
      def a: String
      def b: String
    }
    
    final case class C1(a: String, b: String) extends Trait
    final case class C2(a: String, b: String) extends Trait
    final case class C3(a: String, b: String) extends Trait
    
    object Trait {
      def f(t: Trait): String =
       t match {
        case x @ (_ : C1 | _ : C2) => x.a // the line you are probably interested in
        case y: C3 => y.b
      }
    }
    

    下面是调用f时的一些示例输出:

    scala> Trait.f(C1("hello", "world"))
    res0: String = hello
    
    scala> Trait.f(C2("hello", "world"))
    res1: String = hello
    
    scala> Trait.f(C3("hello", "world"))
    res2: String = world
    

    你可以在Scastie上玩下面的例子。

  •  类似资料:
    • 大家好,我在SCALA上创建了以下案例类: 然后,如您所见,BGP包含Term并扩展到模式,Val包含值并扩展到Term,U、L、B包含字符串并扩展到Value,在我的函数中,我想访问包含U或L或B大小写类的字符串,变量valor=Val(y). value包含一个U类,例如,但当我编写valor时。XXXX没有给我显示名称选项。最大的问题是如何从U访问字符串名称?

    • 本文向大家介绍Scala案例分类和不可变性,包括了Scala案例分类和不可变性的使用技巧和注意事项,需要的朋友参考一下 示例 Scala编译器默认在参数列表中为每个参数加上前缀val。这意味着,默认情况下,案例类是不可变的。每个参数都具有一个访问器方法,但是没有可变器方法。例如: 在案例类中将参数声明为var会覆盖默认行为,并使案例类可变: 案例类为“可变”的另一个实例是案例类中的值是可变的: 请

    • 如何只在pos时返回case类

    • 主要内容:实例,保存并执行代码,实例下面将创建一个名为 Customer 的 Ruby 类,声明两个方法: display_details:该方法用于显示客户的详细信息。 total_no_of_customers:该方法用于显示在系统中创建的客户总数量。 实例 #!/usr/bin/ruby class Customer @@no_of_customers=0 def initialize(id, name, addr) @cus

    • 我对不同类型的标识符案例以及人们对它们的称呼感兴趣。你知道这个名单上还有其他名字吗? :骆驼大小写(例如在java变量名中) :大写的骆驼大小写(例如在java类名中) :Snake大小写(例如在python变量名中) : Kebab大小写(例如球拍名称) :平面大小写(例如在java包名称) :大写(例如C常量名称)

    • 我想生成一个方法,将对象转换为映射字符串,然后再从映射字符串返回到对象。 我按如下方式生成初始对象: 然后,以下方法将给定的映射[字符串,\u]转换为对象: 在下面的方法中,我将初始的转换为,然后返回(通过调用上面的方法): 所以如果我打电话: 输入和输出将匹配。 问题,尝试更进一步,我现在想对类型为名称的字段执行相同的操作。但我希望这一步骤是通用的,因为在不知道字段名称的类型的情况下,我可以将其