Come accedere al parametro di una classe di casi dal contesto di un tratto
Ho un tratto, dì:
sealed trait foo
E una classe case che estende il tratto:
case class bar(data: List[String]) extends foo
Vorrei scrivere una funzione che accede ai dati della barra, ma viene passata come foo, ad esempio:
def doSomething(x: foo) = {does something with foo.data}
E chiamato così:
val aBar = bar(some list)
doSomething(aBar)
Ma non riesco ad accedere quando la funzione doSomething prevede un tipo pippo. Come posso aggirare questo problema per accedere ai valori di un tipo di barra?
Risposte
Non so se questo abbia senso nel contesto del tuo programma, ma potresti definire Foo
come segue:
trait Foo {
def data: List[String]
}
Se ciò non ha senso, forse dovresti abbinare il pattern:
def doSomething(x: Foo) =
x match {
case bar: Bar => ... // or `case Bar(data)`, as Luis suggests
Nota che ho scritto in maiuscolo Foo
e Bar
ovunque; i nomi delle classi e dei tratti dovrebbero sempre essere scritti in maiuscolo nel codice Scala, almeno se vuoi che qualcun altro (ad esempio, le persone che ti aiutano su Stack Overflow) siano in grado di leggere il codice senza confondersi.