Come accedere al parametro di una classe di casi dal contesto di un tratto

Aug 21 2020

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

2 SethTisue Aug 21 2020 at 08:53

Non so se questo abbia senso nel contesto del tuo programma, ma potresti definire Foocome 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 Fooe Barovunque; 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.