【问题标题】:How to access a case class' parameter from context of a trait如何从特征的上下文中访问案例类的参数
【发布时间】:2020-12-10 09:24:19
【问题描述】:

我有一个特质,比如说:

sealed trait foo

还有一个扩展 trait 的案例类:

case class bar(data: List[String]) extends foo

我想写一个访问 bar 数据的函数,但它是作为 foo 传递的,比如说:

def doSomething(x: foo) = {does something with foo.data}

并像这样调用:

val aBar = bar(some list)
doSomething(aBar)

但是当函数 doSomething 需要 foo 类型时,我无法访问。如何解决这个问题以访问条形类型的值?

【问题讨论】:

  • 如果你要求一个 Foo 那么你只能使用一个 Foo 提供的东西,这是多态性的基本原则。你可以在 Foo 中声明data,或者如果特征是密封的,则进行模式匹配。或者也许要求一个酒吧

标签: scala class inheritance case traits


【解决方案1】:

我不知道这在您的程序上下文中是否有意义,但您可以将Foo 定义如下:

trait Foo {
  def data: List[String]
}

如果这没有意义,那么也许您应该进行模式匹配:

def doSomething(x: Foo) =
  x match {
    case bar: Bar => ...    // or `case Bar(data)`, as Luis suggests

请注意,我在任何地方都将FooBar 大写; Scala 代码中的类和特征名称应始终大写,至少如果您希望其他人(例如,在 Stack Overflow 上帮助您的人)能够阅读代码而不会感到困惑。

【讨论】:

  • case Bar(data) ;)
  • 哎呀,我的命名约定已在我的代码中进行了排序,但心不在焉地输入了所有这些。谢谢回复。我应该更清楚,我希望 doSomething 尽可能通用,因为 Bar 可能包含字符串以外的其他内容的列表。我使用了大小写匹配,它工作得很好。仍在学习 Scala 的细节,忘记了我可以使用的一些工具。
猜你喜欢
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 2020-11-01
  • 2011-04-07
  • 2020-04-30
  • 1970-01-01
相关资源
最近更新 更多