提取 Scala 案例类值

Zac*_*ins 0 scala class case traits pattern-matching

我的 Scala 项目具有以下特征

sealed trait Value
case class Float(f: Double) extends Value
case class Bool(b: Boolean) extends Value
case object Error extends Value
Run Code Online (Sandbox Code Playgroud)

后来我有了价值lst: List[Value]。

我正在尝试获取列表中第一个元素的值,lst.head.f但出现以下错误Cannot resolve symbol f。

从我从类似主题的其他堆栈溢出问题中收集的信息来看,它应该可以工作,但事实并非如此。

Tim*_*Tim 5

代码需要允许为lst空或第一个Value不是Float. 此代码将安全地将任何Double值提取到Option:

val optF: Option[Double] = lst.headOption.collect{ case Float(f) => f}
Run Code Online (Sandbox Code Playgroud)

这将返回Some如果是在列表中的第一个元素,它是一个Float,否则将返回None。使用标准Option操作检查错误,或仅使用getOrElse.

  • 可能最好阅读一些文章,但“Option”是一种处理可能存在或不存在的值的方法。它是使用“null”或其他无效值的类型安全替代方案。如果“Option”不存在,则值为“None”;如果存在,则为“Some(value)”。您可以在“Option”上使用“getOrElse(default)”来检索值(如果存在),或者获取默认值(如果不存在)。它就像一个包含 0 或 1 个元素的集合,因此许多集合方法也可以工作,例如“isEmpty”。 (3认同)
  • @ZacharyElkins https://alvinalexander.com/scala/best-practice-option-some-none-pattern-scala-idioms/ (2认同)