【问题标题】:Extracting Scala Case Class Value提取 Scala 案例类值
【发布时间】:2021-01-27 00:03:02
【问题描述】:

我的 Scala 项目有以下特点

sealed trait Value
case class Float(f: Double) extends Value
case class Bool(b: Boolean) extends Value
case object Error extends Value

后来我得到了lst: List[Value]的值。

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

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

【问题讨论】:

  • lst.head.f 在lst = List(Bool(true)) 或lst = List(Error) 上应该产生什么?
  • 可能你想要lst.head match { case Float(f) => f } 或lst.head match { case x: Float => x.f }。
  • 如果列表为空怎么办?如果第一个值不是 Float 怎么办?
  • 既然你说你是 Scala 的新手,让我给你一些建议。 Scala 不是另一种 OOP 语言,您只需要学习它的语法。 Scala 是 OOP 和 FP 的混合体,因此,您需要重新学习很多东西,尤其是如何设计程序以及如何解决问题。不变性、选项、高阶函数等是函数式语言的设计模式。所以建议是买一本书或找到一门课程,不仅可以指导您了解语法,还可以指导您了解函数式程序员的思维方式。

标签: scala class pattern-matching case traits


【解决方案1】:

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

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

如果列表中有第一个元素并且它是Float,则返回Some,否则返回None。使用标准的Option 操作来检查错误,或者使用getOrElse 获取一个值。

【讨论】:

  • 你能解释一下Option是什么吗?我是 Scala 新手
  • 可能最好阅读一些文章,但Option 是一种处理可能存在或不存在的值的方法。它是使用null 或其他一些无效值的类型安全替代方案。 Option 值要么是 None(如果不存在),要么是 Some(value)(如果存在)。您可以在 Option 上使用 getOrElse(default) 来检索值(如果存在),或者获取默认值(如果不存在)。它就像一个包含 0 或 1 个元素的集合,因此许多集合方法也可以使用,例如 isEmpty。
【解决方案2】:

您的lst 具有Value 类型,它没有定义值f。

如果列表中的第一个元素是Bool 类型怎么办?它显然也没有定义f。

您的用例是什么?您可以确保Values 的所有子类型都使用

定义f
sealed trait Value {
   def f 
}

如果类型是Float,则直接获取f


lst.head match {
  case Float(f) => 
    // Do something with 
    f
  case Bool(b) =>
    // Do something with 
    b
  case e: Error => 
    // Do something with the error
}

【讨论】:

    【解决方案3】:

    就这么简单:

    val v1 = lst(0) match => {
      Float(f) => f
      Bool(b) => b
      _ => "Something else"
    }
    

    我只是想多了。

    【讨论】:

    • 修复发布代码中的语法错误后,查看v1 结果的类型。不是一个非常有用的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多