verdad teoremas tabla postulados logico funciones expresiones expresion ejercicios ejemplos definicion convertir circuito booleanas booleana boole groovy

teoremas - Groovy Truth: ¿secuencia a inconsistencia booleana?



expresiones booleanas definicion (5)

En groovy:

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

¿Alguien puede aclarar este comportamiento?


Ambos

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

crea una instancia de java.lang.Boolean utilizando el constructor que toma un solo argumento de cadena. Según los javadocs , la regla es:

Asigna un objeto Boolean que representa el valor true si el argumento de cadena no es nulo y es igual, ignorando el caso, 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 ''verdadera'' (sin distinción de mayúsculas y minúsculas), por lo que la booleana creada es falsa.

Por el contrario, ''test'' as Boolean sigue las reglas del lenguaje Groovy para la coerción a un booleano , lo que le permite escribir:

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

Para una Cadena, la regla es que si está vacía o nula, se evalúa como falsa, de lo contrario es verdadera.

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


Don tiene razón en eso:

''test'' as Boolean sigue las reglas del lenguaje Groovy para la coerción a un booleano

que también se conoce como "Groovy truth".

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

String.toBoolean() Convierte la cadena dada en un objeto booleano. Si la cuerda recortada es "verdadera", "y" o "1" (ignorando el caso), entonces el resultado es verdadero; de lo contrario, es falso.

Algunos buenos ejemplos de cadenas y su conversión con 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()


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


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

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ícito en el segundo if, if (i! = Null) o if (i! = 0)

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


Tiendo a estar de acuerdo con el punto de @cdeszaq sobre el constructor, y por lo que se refiere a tu primer ejemplo, diría que lo está lanzando a un bool. Mientras el puntero no sea nulo, será verdadero. Me imagino que .toBoolean() realmente intenta analizar el valor de su objeto. Considera ejecutar ''true''.toBoolean() y ''1''.toBoolean() para ver qué devuelven.

Nunca escuché hablar de Groovy antes de esta pregunta, todo esto puede ser incorrecto.