我对各种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
}
}
这对我有用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")
}
让我们一步一步地去那里:
>
|
运算符,在模式匹配的上下文中,允许您以以下形式定义替代模式:
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]转换为对象: 在下面的方法中,我将初始的转换为,然后返回(通过调用上面的方法): 所以如果我打电话: 输入和输出将匹配。 问题,尝试更进一步,我现在想对类型为名称的字段执行相同的操作。但我希望这一步骤是通用的,因为在不知道字段名称的类型的情况下,我可以将其