perl truthiness

¿Cómo evalúa Perl 6 la veracidad?



truthiness (6)

Así que para combinar lo que creo que es la mejor de las respuestas de todos:

Cuando evalúa una variable en contexto booleano, se llama a su método .true (). El método predeterminado .true () utilizado por un objeto realiza una comprobación Perl 5-style <0, "", undef> del valor del objeto, pero cuando dices "pero es verdadero" o "pero falso", este método se reemplaza por uno que no mira el valor simplemente devuelve una constante.

Uno podría concebir escribir un método true () que, por ejemplo, devuelve verdadero cuando el valor era par y falso cuando era impar.

Al leer sobre Perl 6, veo que se está pregonando una característica en la que ya no tienes que hacer más:

return "0 but true";

... pero puede hacer:

return 0 but True;

Si ese es el caso, ¿cómo funciona la verdad en Perl 6? En Perl 5, era bastante simple: 0, "" y undef son falsos, todo lo demás es verdadero.

¿Cuáles son las reglas en Perl 6 cuando se trata de contexto booleano?


De acuerdo con Perl 6 y Parrot Essentials de O''Reilly, false es 0, undef, la cadena vacía y los valores marcados como falsos . cierto es todo lo demás.

Además, Perl 6 tiene tanto un tipo booleano primitivo como funciones True y False que cualquier valor puede mezclar (para que pueda tener un valor "0 pero verdadero" o uno "1 pero falso" por ejemplo, o una lista falsa que contiene elementos, o una lista verdadera que está vacía).

Ver http://www.mail-archive.com/[email protected]/msg09930.html


La prueba de verdad solo llama al método .true en un objeto, por lo que la operación "mezclar" $stuff but True just (entre otras cosas) anula ese método.

Esto se especifica en S02 , generalmente los tipos enum (de los cuales Bool es uno) se describen en S12 .


Perl 6 evalúa la verdad ahora haciendo una pregunta al objeto en lugar de mirar su valor. El valor no es el objeto. Es algo que me gustó de otros lenguajes de objetos y estaré encantado de tener en Perl: puedo decidir cómo responde el objeto y puedo modificarlo. Como dijo, podría hacer eso en Perl 5 con sobrecarga, pero siempre siento que tengo que lavarme las manos después de hacerlo de esa manera. :)

Si no hace nada para cambiar eso, Perl 6 se comporta de la misma manera que Perl 5, por lo que obtiene la menor cantidad de sorpresa.


Un valor falso que se descuida en casi todas partes es "0". Hace poco hice este doloroso descubrimiento de que "0" es falso en PERL 5. Gee. Una cadena no vacía que es falsa Realmente estaba esperando que eso cambiara en PERL6, pero supongo que no.

> if ( "0" ) { say "True" } else { say "False" } False

La expresión || = golpeaba algunas cadenas que realmente no esperaba:

$ perl -e ''$x = "0"; $x ||= ""; print ">>$x<</n";'' >><<


Ver Sinopsis 12: Roles .

Las reglas son las mismas, pero el "pero" copia el 0 y aplica un rol a la copia que hace que sea verdadero en el contexto booleano.

Puedes hacer lo mismo con la sobrecarga en Perl 5.