Quel est le problème avec tous les différents opérateurs d'égalité Perl 6? (==, ===, éq, eqv, ~~, =: =, & # 8230;)
Question
Perl 6 semble avoir une explosion d'opérateurs d'égalité. Qu'est-ce que =: =
? Quelle est la différence entre leg
et cmp
? Ou eqv
et ===
?
Quelqu'un at-il un bon résumé?
La solution
=: = vérifie si deux conteneurs (variables ou éléments de tableaux) ou hashes) sont aliasés, c'est-à-dire que si l'un change, l'autre change-t-il aussi?
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
Comme pour les autres: === vérifie si deux références pointent vers le même objet et eqv vérifie si deux éléments sont structurellement équivalents. Donc, [1, 2, 3] === [1, 2, 3]
sera faux (pas le même tableau), mais [1, 2, 3] eqv [1, 2, 3]
sera vrai (même structure).
leg
compare des chaînes telles que le cmp
de Perl 5, tandis que le cmp
de Perl 6 est plus intelligent et comparera des nombres tels que < = > ;
et des chaînes telles que 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.
Enfin, ~~
est la "correspondance intelligente", elle répond à la question "le $ x
correspond-il à $ y
". Si $ y
est un type, c'est un contrôle de type. Si $ y
est une expression rationnelle, sa correspondance est une expression régulière - et ainsi de suite.
Autres conseils
De Reddit aujourd'hui:
Le résumé présenté dans la Synopsis 3: Sémantique de comparaison fait ce que vous voulez ou était-il tu lis déjà ça? Les documents de conception sont liés aux fichiers de test dans lesquels ces fonctionnalités sont utilisées. Vous pouvez ainsi voir des exemples de leur utilisation et de leur état de test actuel.
Les opérateurs de comparaison de Perl 6 sont beaucoup plus adaptés à un langage dynamique et à tout ce qui se passe. Au lieu de simplement comparer des chaînes ou des chiffres (ou de transformer des éléments en chaînes ou en chiffres), vous pouvez maintenant tester les éléments avec précision, avec un opérateur qui fait ce que vous voulez. Vous pouvez tester la valeur, le conteneur, le type, etc.
Dans l'un des commentaires, vous posez des questions sur eqv
et cmp
. Dans l'ancien temps de Perl 5, cmp
était présent pour le tri et renvoyait l'une des trois valeurs magiques (-1,0,1), toujours avec la sémantique de chaîne. En Perl 6, cmp
renvoie l'un des trois types d'objets Order
, de sorte que vous n'avez pas à vous rappeler ce que -1, 0 ou 1 signifie. De plus, le nouveau cmp
ne force pas la sémantique des chaînes de caractères, il peut donc être plus intelligent quand on leur donne des nombres (contrairement à Perl 5 qui trierait comme 1, 10, 11, 2, 20, 21 ...) .
La jambe
( l que, e qual, g supérieur à) est cmp
avec la sémantique des chaînes. Il est défini en tant que ~ $ a cmp ~ $ b
de Perl 6, où ~
est le nouveau " contextualizer de chaîne " qui force la sémantique des chaînes. Avec leg
, vous effectuez toujours une comparaison de chaînes, tout comme l’ancien Perl 5 cmp
.
Si vous avez encore des questions sur les autres opérateurs, divisez-les en questions distinctes. :)
C’est également un guide de référence pratique: