2012-07-30 14 views
21

Come faccio a giocare questa ad un int e non Some(Int)Fusioni Opzione [Qualsiasi] a int

val a: Option[Any] = Some(1) 

ho provato toInt e ha dato un errore value toInt is not a member of Option[Any]

risposta

34

Si potrebbe fare a.get.asInstanceOf[Int] tuttavia non è sicuro. Un modo migliore sarebbe quello di conservare le informazioni sul tipo, ad esempio utilizzando Option[Int] anziché Option[Any]. Quindi non è necessario trasmettere il risultato con asInstanceOf.

val a:Option[Int] = Some(1) 
val i = a.get 

Utilizzando get è direttamente pericoloso in quanto se il Option è un None viene generata un'eccezione. Quindi usare getOrElse è più sicuro. Oppure puoi utilizzare la corrispondenza dei modelli su a per ottenere il valore.

val a:Option[Any] = Some(1) // Note using Any here 
val i = (a match { 
    case Some(x:Int) => x // this extracts the value in a as an Int 
    case _ => Int.MinValue 
}) 
+1

Dimentica il bit sul casting; la corrispondenza del modello è chiaramente la strada da percorrere –

+0

Sono d'accordo. La corrispondenza dei pattern è molto potente e impressionante :) –

12

Utilizzando .asInstanceOf metodo

a.getOrElse(0).asInstanceOf[Int] 

Devo notare che questo è non sicuro cast: se la tua Opzione non contiene Int, otterrai il runt ime eccezione.

3

Il motivo per cui non puoi lanciare è perché non si dovrebbe lanciare. Mentre i linguaggi di programmazione tipizzati statici consentono di eseguire manualmente il cast tra un tipo e l'altro, il miglior consiglio che posso darti è di dimenticare queste funzionalità.

In particolare, se si desidera ottenere il meglio da ogni linguaggio di programmazione, provare a creare un utente appropriato e, se una lingua non si adatta all'utilizzo desiderato, è sufficiente sceglierne un altro (ad esempio uno dinamico). :

Se fai getta che si accende un potenziale errore di tempo di compilazione, che abbiamo come perché è facile da risolvere, in un ClassCastException, che non ci piace perché si verifica in fase di esecuzione. Se hai bisogno di usare cast in Scala, molto probabilmente stai usando un pattern improprio.

+3

O stai usando librerie Java (mal progettate) ... – ziggystar

+2

Mentre apprezzo il sentimento, nei progetti di vita reale, le cose non sono sempre in bianco e nero. C'è una legittima necessità per me di farlo in quanto potrebbe essere uno dei 4 tipi restituiti dall'API di terze parti sottostante. – Bob

+0

Questo è un meccanismo molto debole. Puoi fare lo stesso con schemi migliori probabilmente ... Perché non provi a spiegare cosa vuoi fare? – Edmondo1984