2012-01-19 8 views

risposta

31

Entrambi questi

println 'test'.toBoolean() //false 
println new Boolean('test') //false 

istanziare java.lang.Boolean utilizzando il costruttore che accetta un singolo argomento stringa. Secondo the javadocs, la regola è:

alloca un oggetto booleano che rappresenta il valore vero se l'argomento stringa non è nullo ed è uguale, ignorando caso, la stringa "vera". Altrimenti, allocare un oggetto booleano che rappresenta il valore false.

In entrambi i casi precedenti, la stringa non corrisponde a "true" (maiuscole/minuscole), quindi il booleano creato è falso.

Al contrario 'test' as Boolean segue le regole del linguaggio Groovy per coercion to a boolean, che consente di scrivere:

if ('hello') { 
    println 'this string is truthy' 
} 

per una stringa, la regola è che se è vuoto o nullo, vale false, altrimenti vero.

Sono d'accordo sul fatto che questo potrebbe essere considerato un po 'incoerente, ma data una scelta tra coerenza con il constatore di java.lang.Boolean e utilità, penso che avevano ragione a scegliere il secondo.

+3

Penso che volevi mostrare i due casi falsi prima di "Entrambi" – ataylor

+0

@ataylor grazie per la correzione, ho aggiornato la risposta –

1

Il costruttore booleano sta prendendo la stringa assegnata e sta eseguendo il metodo toBoolean() su quella stringa. In breve, tutto ciò che è non può analizzare poiché un valore booleano valido viene considerato falso. O, in altre parole, solo 'vero' è vero.

0

Vorrei essere d'accordo con il punto @ cdeszaq sul costruttore, e per quanto riguarda il tuo primo esempio, direi che è solo un casting per un bool. Finché il puntatore non è nullo sarà vero. Immagino che lo .toBoolean() tenti effettivamente di analizzare il suo valore dell'oggetto. Valuta di eseguire 'true'.toBoolean() e '1'.toBoolean() per vedere cosa restituiscono.

Non ho mai sentito parlare di Groovy prima di questa domanda, questo potrebbe non essere corretto.

+1

'1'.toBoolean() restituisce true. Puoi testarlo qui: http://groovyconsole.appspot.com/ – Raphael

+0

Cheers, link utile! +1 –

16

Don è proprio in quella:

'test' as Boolean segue le regole del linguaggio Groovy per coercion to a boolean

che è anche conosciuto come "verità Groovy".

Ma String.toBoolean() in groovy non costruisce semplicemente un booleano con la stringa come argomento. Dal groovy api docs on String.toBoolean():

String.toBoolean() Converte la stringa in un oggetto booleano. Se la stringa tagliata è "true", "y" o "1" (ignorando il caso), il risultato è true, altrimenti è falso.

A few good examples for strings and their conversion with toBoolean():

assert "y".toBoolean() 
assert 'TRUE'.toBoolean() 
assert ' trUe '.toBoolean() 
assert " y".toBoolean() 
assert "1".toBoolean() 

assert ! 'other'.toBoolean() 
assert ! '0'.toBoolean() 
assert ! 'no'.toBoolean() 
assert ! ' FalSe'.toBoolean() 
0

Tuttavia, se applicato ad altri oggetti, un'incongruenza nasce:

int i = 0 
String s = 'abc' 

if (s) 
    println 's is true' // will be printed 

if (i) 
    println ' i "is true" ' // will not be printed 

(Groovy 1.7.8)

Devi essere esplicito nel secondo se, se (i! = null) o if (i! = 0)

Alcuni bug possono essere rintracciati per il controllo di numeri interi non nulli utilizzando if (i).