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的细节,忘记了我可以使用的一些工具。