Scala模式匹配case类示例,包含任意数量的None字段

zqdjd7g9  于 2023-06-23  发布在  Scala
关注(0)|答案(1)|浏览(113)

假设我有下面的Scala代码片段

case class A(a: Option[String], b: Option[String])
val v: A = A(None, None)
val vOp: Option[A] = v match {
  case A(None, None) => None  // can I make this simpler / more generalized
  ...
}

A的示例包含所有None值而不显式键入每个值时,有没有一种方法可以进行模式匹配?
例如,我正在寻找沿着case A(None :_*) => None的东西,但我知道这在语法上是无效的。

Context我的用例是,我正在对一个case类进行模式匹配,该case类具有许多频繁更改的底层字段,因此我希望尽可能避免枚举所有潜在的None值。

siv3szwd

siv3szwd1#

你可以这样做:

object Empty {
   def unapply(p: Product) = p.productIterator.forall(_ == None)
}

然后你可以这样写:

A(None, None) match { 
     case Empty() => "is empty"
     case _ => "not empty"
   }

但我得说我觉得这不是个好主意。你说你需要这个,因为有很多字段,而且它们经常变化。但是“基本情况”,当一切都是None时,是你的问题中最小的。当某些字段 notNone时,你会怎么做?如果你不知道有什么字段,甚至不知道有多少字段,你的match语句可能有什么有用的逻辑呢?

相关问题