2012-01-19 16 views

Respuesta

31

Ambos

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

instancias de un java.lang.Boolean utilizando el constructor que toma un solo argumento de cadena. De acuerdo con the javadocs, la regla es:

asigna un objeto booleano que representa el valor verdadero si el argumento de cadena no es nulo y es igual, ignorando mayúsculas y minúsculas, a la cadena "true". De lo contrario, asigne un objeto booleano que represente el valor falso.

En los dos casos anteriores, la cadena no coincide con 'true' (no distingue entre mayúsculas y minúsculas), por lo que el booleano creado es falso.

Por el contrario 'test' as Boolean sigue las reglas del lenguaje Groovy para coercion to a boolean, lo que le permite escribir:

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

para una cadena, la regla es que si está vacío o nulo, se evalúa como falsa, lo contrario es cierto.

Estoy de acuerdo en que esto podría considerarse un poco inconsistente, pero dada la opción entre la coherencia con el constuctor de java.lang.Boolean y la utilidad, creo que tuvieron razón al elegir este último.

+3

Creo que quisiste mostrar los dos casos falsos antes de "Ambos de estos" – ataylor

+0

@ataylor gracias por la corrección, he actualizado la respuesta –

1

El constructor booleano toma la cadena que le dio y ejecuta el método toBoolean() en esa cadena. En pocas palabras, cualquier cosa no puede analizar ya que un valor booleano válido se trata como falso. O, en otras palabras, solo 'verdadero' es verdadero.

0

Tiendo a estar de acuerdo con el punto de @cdeszaq sobre el constructor, y en cuanto se conserve su primer ejemplo, diría que lo está lanzando a un bool. Mientras el puntero no sea nulo, será verdadero. Imagino que .toBoolean() realmente intenta analizar el valor de su objeto. Considere ejecutar 'true'.toBoolean() y '1'.toBoolean() para ver lo que devuelven.

Nunca he oído hablar de Groovy antes de esta pregunta, esto puede ser incorrecto.

+1

'1'.toBoolean() devuelve verdadero. Puede probarlo aquí: http://groovyconsole.appspot.com/ – Raphael

+0

¡Salud, enlace útil! +1 –

16

Don tiene razón en que:

'test' as Boolean sigue las reglas del lenguaje Groovy para coercion to a boolean

que también se conoce como "la verdad maravilloso".

Pero String.toBoolean() en groovy no solo construye un booleano con la cadena como argumento. Desde el groovy api docs on String.toBoolean():

String.toBoolean() Convierte la cadena dada en un objeto Boolean. Si la cuerda recortada es "verdadera", "y" o "1" (ignorando el caso), entonces el resultado es verdadero; de lo contrario, es 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

Sin embargo, cuando se aplica a otros objetos, surge una inconsistencia:

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)

Tienes que ser explícita en el segundo if, if (i! = null) o if (i! = 0)

Algunos errores se pueden remontar a la comprobación de un entero no nulo utilizando if (i).