【问题标题】:Extending Case Object扩展案例对象
【发布时间】:2021-08-25 14:04:23
【问题描述】:

我是 Scala 的新手,如果出现愚蠢的问题,我深表歉意: 我有一些共同的状态,我不会拥有 enum(trait)

Trait A

Object A {
   case object A1 extends A
   case object A2 extends A
val vectA = Vector(A1,A2)
}

我有 2 个孩子需要额外的身份

Trait B extends A

Object B extends A{
   case object B1 extends B
   case object B2 extends B

val cVect = Vector(B1,B2) ++ A.vectA
def apply(status: String): C = {

cVect.find(_.toString == status).getOrElse("error")
  }
}
Trait C extends A

Object C extends A{
   case object C1 extends C
   case object C2 extends C
val cVect = Vector(C1,C2) ++ A.vectA

def apply(status: String): C = {

cVect.find(_.toString == status).getOrElse("error")
  }
}

基本上,我有 apply 方法,它将接受字符串并返回 B 或 C 类型的特征

期待

val x = B.apply("A1") to return B type enum.

我可能做错了什么,所以请给我正确的方法来处理这种情况

【问题讨论】:

  • 请。这正是我想要的。

标签: scala object case traits


【解决方案1】:

你可能想做这样的事情:

sealed trait A

sealed trait ACompanion {
  def vect: Vector[A]
  
  final def apply(status: String): Option[A] =
    vect.find(_.toString.toLowerCase == status.toLowerCase)
}

object A extends ACompanion {
  final case object A1 extends A
  final case object A2 extends A
  
  override final val vect: Vector[A] = Vector(A1, A2)
}

sealed trait B extends A
object B extends ACompanion {
  final case object B1 extends B
  final case object B2 extends B

  override final val vect: Vector[A] = Vector(B1, B2) ++ A.vect
}

sealed trait C extends A
object C extends ACompanion {
  final case object C1 extends C
  final case object C2 extends C
  
  override final val vect: Vector[A] = Vector(C1, C2) ++ A.vect
}

请注意,除了修正一些错别字外,使用sealed 并为同伴创建trait 以减少代码重复。主要变化是理解vect 将永远是Vector[A];因此find 返回一个Option[A]
这是因为即使对于 BC,您正在添加额外的案例,但您还需要提供原始的 A 案例,因此您的返回类型将需要为 @987654332 的最小上限@


可以看到运行here的代码

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多