Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何访问案例类';特征上下文中的参数_Scala_Class_Inheritance_Case_Traits - Fatal编程技术网

Scala 如何访问案例类';特征上下文中的参数

Scala 如何访问案例类';特征上下文中的参数,scala,class,inheritance,case,traits,Scala,Class,Inheritance,Case,Traits,我有一个特点,比如: sealed trait foo 以及扩展trait的case类: 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) 但是当doSomethin

我有一个特点,比如:

sealed trait foo
以及扩展trait的case类:

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
,如下所示:

trait Foo {
  def data: List[String]
}
如果这没有意义,那么也许您应该匹配模式:

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

注意,我在所有地方都大写了
Foo
Bar
;在Scala代码中,类和特征名称应该始终大写,至少如果您希望其他人(例如,帮助您处理堆栈溢出的人)能够阅读代码而不会感到困惑的话。

如果您需要一个Foo,那么您只能使用want a Foo提供的名称,这是多态性的基本原则。您可以在Foo中声明
数据
,或者如果特征是密封的,则进行模式匹配。或者要求一个条形图,
casebar(数据)
;)哎呀,我在代码中对命名约定进行了排序,但是心不在焉地键入了所有这些。谢谢你的回复。我应该更清楚的是,我希望doSomething尽可能的通用,因为它可能包含一个列表,而不是字符串。我使用了案例匹配,效果非常好。仍然在学习Scala的细节,忘记了我可以使用的一些工具。