in Groovy:Groovy Truth: da stringa a incongruenza booleana?
println 'test' as Boolean //true
println 'test'.toBoolean() //false
println new Boolean('test') //false
Qualcuno può chiarire questo comportamento?
in Groovy:Groovy Truth: da stringa a incongruenza booleana?
println 'test' as Boolean //true
println 'test'.toBoolean() //false
println new Boolean('test') //false
Qualcuno può chiarire questo comportamento?
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.
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.
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'.toBoolean() restituisce true. Puoi testarlo qui: http://groovyconsole.appspot.com/ – Raphael
Cheers, link utile! +1 –
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()
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).
Penso che volevi mostrare i due casi falsi prima di "Entrambi" – ataylor
@ataylor grazie per la correzione, ho aggiornato la risposta –