Scala, verifica il tipo e quindi esegue il cast

1

A volte ho l'usecase di cui ho bisogno per verificare se una variabile è di un tipo specifico e se è stata scelta per accedere a una proprietà / funzione di essa.

Esempio:

    if (state.isInstanceOf[StateA] && state.asInstanceOf[StateA].isFlagBlaBla)

Come può essere migliorato? Potrei usare match / case ma c'è un'opzione migliore (più breve)?

    
posta Marco 24.12.2015 - 17:29
fonte

1 risposta

2

Il modo più breve è di progettare la tua applicazione in modo che la tua variabile abbia già .isFlagBlaBla , rendendo state già un'istanza di StateA o rendendo .isFlagBlaBla un metodo della classe base che stai usando . Questo è il principio base SOLID OOP. Se pubblichi più contesto in un'altra domanda, potremmo aiutarti a refactoring.

A parte questo, non c'è davvero alcun modo per accorciarlo, oltre ad estrarlo in una funzione. I linguaggi funzionali consentono di semplificare praticamente qualsiasi cosa estraendoli in una funzione. Puoi sempre scrivere un abominio come il seguente:

  class BaseState() {
    import scala.reflect.{ClassTag, classTag}

    def castAndTest[A: ClassTag](f: A => Boolean): Boolean =
      if (classTag[A].runtimeClass.isInstance(this)) f(this.asInstanceOf[A])
      else false
  }

  class StateA() extends BaseState {
    def isFlagBlaBla = true
  }

  def main(args: Array[String]) {
    val baseState: BaseState = new BaseState()
    val stateA:    BaseState = new StateA()

    baseState castAndTest[StateA] {_.isFlagBlaBla} // returns false
    stateA    castAndTest[StateA] {_.isFlagBlaBla} // returns true
  }

I tipi di cast sono estremamente rari nelle lingue con sistemi di tipi potenti come quelli di Scala. Non ho letteralmente mai dovuto farne uno in Scala, e non ricordavo nemmeno la sintassi. Anche nelle lingue con sistemi di tipo medio-resistenti, dovrebbero essere sottoposti a un esame approfondito.

    
risposta data 24.12.2015 - 21:02
fonte

Leggi altre domande sui tag