2011-12-29 20 views
6

Sto cercando una soluzione per verificare se un valore di qualsiasi tipo è vuoto (o predefinito). Cioè qualche tipo di metodo su Any che verifica se un'istanza String è uguale a "", un Int - a 0, un Float - a 0f, un Boolean - a false, un List contiene articoli e così via per altri tipi. Prima di tutto mi interessa sapere se alcune soluzioni esistono già nella libreria standard e se no come la implementeresti. Credo che questo potrebbe essere utile e se non esiste nella libreria standard dovrebbe essere suggerito.Test su valore vuoto universale per tutti i tipi

risposta

11

Utilizzare classe Zero da Scalaz.

scala> import scalaz._, Scalaz._ 
import scalaz._ 
import Scalaz._ 

scala> def isEmpty[A : Zero](value: A) = value == mzero[A] 
isEmpty: [A](value: A)(implicit evidence$1: scalaz.Zero[A])Boolean 

scala> isEmpty("") 
res0: Boolean = true 

scala> isEmpty(List()) 
res1: Boolean = true 

scala> isEmpty(false) 
res2: Boolean = true 

scala> isEmpty("O HAI") 
res3: Boolean = false 

Link to a blog post di un mio argomento correlato.

+1

Ottimo post sul blog! Perché suggerisci la soluzione basata su Scalaz? –

+0

@NikitaVolkov: Non è necessario utilizzare Scalaz. Ho incluso un collegamento a "Zero.scala' in Scalaz e, come puoi vedere, è banale scrivere da solo. – missingfaktor

2

Invece di passare intorno alle cose di tipo T, si potrebbe passare intorno alle cose di tipo opzione [T], avvolgendo ogni cosa validi di tipo T, in questo modo

val thing = 1 
val thingOption = Some(thing) 

e la memorizzazione di tutti i dati non validi come Nones, in questo modo

val thingOption = None 

quindi, se si vuole prendere una decisione in base al valore di thingOption, si può fare in questo modo

thingOption match { 
    case None => // Whatever you want to do with defaults 
    case Some(x) => // Whatever you want to do with 'thing' if it isn't a default 
} 
+1

@NikitaVolkov, propongo un esperimento, metto un promemoria per un anno da oggi nel tuo calendario con un link alla tua domanda. Quando viene visualizzato il promemoria, torna a questa risposta e al tuo commento per vedere se ti senti ancora lo stesso. – huynhjl

+0

@huynhjl Conosco molto bene i vantaggi dell'approccio 'Option' su' null', ma con la mia osservazione sottolineo che questo suggerimento non ha nulla a che fare con la domanda corrente. C'è un bordo piuttosto solido tra 'null' e' "" 'o' 0' –

+0

Questo non risponde direttamente alla domanda, ma è molto rilevante. Testare se un valore è "zero-esque" è spesso un segno che dovresti usare Opzioni invece. –

Problemi correlati