operators - ¿Cuál es el trato con todos los diferentes operadores de igualdad de Perl 6?(==,===, eq, eqv, ~~,=:=,...)
Perl 6 parece tener una explosión de operadores de igualdad. ¿Qué es =:=
? ¿Cuál es la diferencia entre leg
y cmp
? O eqv
y ===
?
¿Alguien tiene un buen resumen?
Esta es también una guía de referencia útil:
¿El resumen en Synopsis 3: Semántica de comparación hace lo que quiere, o ya lo estaba leyendo? Los documentos de diseño se vinculan a los archivos de prueba donde se usan esas características, por lo que puede ver ejemplos de su uso y su estado de prueba actual.
Los operadores de comparación de Perl 6 son mucho más adecuados para un lenguaje dinámico y todas las cosas que están sucediendo. En lugar de simplemente comparar cadenas o números (o convertir cosas en cadenas o números), ahora puede probar cosas con precisión con un operador que hace lo que quiere. Puede probar el valor, el contenedor, el tipo, etc.
En uno de los comentarios, preguntas sobre eqv
y cmp
. En los viejos tiempos de Perl 5, cmp
estaba allí para clasificar y devuelve uno de los tres valores mágicos (-1,0,1), y siempre lo hacía con la semántica de cadenas. En Perl 6, cmp
devuelve uno de los tres tipos de objetos Order
, por lo que no tiene que recordar qué significa -1, 0 o 1. Además, el nuevo cmp
no fuerza la semántica de cuerdas, por lo que puede ser más inteligente cuando se entregan números (a diferencia de Perl 5 que ordenaría como 1, 10, 11, 2, 20, 21 ...).
El leg
( l ess que, e qual, g reater than) es cmp
con semántica de cadenas. Se define como Perl 6 ~$a cmp ~$b
, donde ~
es el nuevo "contextualizador de cadenas" que fuerza la semántica de cadenas. Con la leg
, siempre estás haciendo una comparación de cuerdas, al igual que el antiguo Perl 5 cmp
.
Si todavía tiene preguntas sobre los otros operadores, dividámoslas en preguntas separadas. :)
=: = prueba si dos contenedores (variables o elementos de matrices o hash) tienen alias, es decir, si uno cambia, ¿el otro también cambia?
my $x;
my @a = 1, 2, 3;
# $x =:= @a[0] is false
$x := @a[0];
# now $x == 1, and $x =:= @a[0] is true
$x = 4;
# now @a is 4, 2, 3
En cuanto a los demás: === prueba si dos referencias apuntan al mismo objeto, y las pruebas eqv si dos cosas son estructuralmente equivalentes. Entonces [1, 2, 3] === [1, 2, 3]
será falso (no la misma matriz), pero [1, 2, 3] eqv [1, 2, 3]
será verdadero (misma estructura) )
leg
compara cadenas como cmp
Perl 5, mientras que cmp
Perl 6 es más inteligente y compara números como <=>
y cadenas como leg
.
13 leg 4 # -1, because 1 is smaller than 4, and leg converts to string
13 cmp 4 # +1, because both are numbers, so use numeric comparison.
Finalmente ~~
es la "coincidencia inteligente", responde a la pregunta "does $x
match $y
". Si $y
es un tipo, es un tipo de verificación. Si $y
es una expresión regular, es una coincidencia de expresiones regulares, y así sucesivamente.