2008-09-24 7 views
23

Al leer sobre Perl 6, veo una característica que se pregonó alrededor, donde ya no tiene que hacer:¿Cómo evalúa Perl 6 la veracidad?

return "0 but true"; 

... pero en su lugar 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 del contexto booleano?

+1

en Perl 5 es común el uso de '0E0' como un 'cero pero cierto' valor de retorno que – EvdB

+8

Te daré un voto favorable para usar el valor de "verdad" en una pregunta técnica :) –

+1

@PaulDixon: El término también se usa en la comunidad de Ruby. –

Respuesta

3

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

Cuando se evalúa una variable en contexto booleano, a su método .TRUE() es llamado. El método predeterminado .true() utilizado por un objeto realiza un Perl 5-style < 0, "", undef> marca el 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.

Podría concebirse escribir un método true() que, digamos, devuelto verdadero cuando el valor era par y falso cuando era impar.

6

de acuerdo con Perl 6 and Parrot Essentials, falsa es 0 O'Reilly, UNDEF, la cadena vacía, y los valores de marca como falsa. true es todo lo demás.

Además, Perl 6 tiene tanto un tipo booleano primitivo y por tener verdaderos y falsos papeles que cualquier valor puede mezclar en (lo que puede tener un valor "0 but True" o un "1, pero falso" uno para 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

+2

Ese libro es antiguo y no representa el estado actual del idioma. –

11

Ver Synopsis 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.

Usted puede hacer lo mismo con la sobrecarga en Perl 5.

+1

Er, ¿no te refieres a "verdadero en un contexto booleano"? – Ovid

15

Perl 6 evalúa verdad ahora pidiendo al objeto una pregunta en lugar de mirar a 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.

+1

Eso estaría más orientado a objetos que Ruby, solo 'false' y' nil' carecen de veracidad, y no hay nada que puedas hacer al respecto, a menos que monopatch '!' Y '' foo'. –

11

La prueba de la verdad solo llama al método .true en un objeto, por lo que la operación "mezclar" $stuff but True acaba (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.

1

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 || = idioma clobbered algunas cadenas Realmente no esperaba:

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

Es por eso que [defined-or] (http://perltraining.com.au/tips/2008-03-03.html) '//' es muy agradable. Está habilitado (comenzando en Perl 5.10) por 'use 5.010'. –

+0

Vaya, acabo de recordar que, dado que se ha definido o no entra en conflicto con la sintaxis anterior, está habilitado de forma predeterminada. –

Cuestiones relacionadas