2017-07-06 3 views

Répondre

5

Une Hash normale contraint toutes ses clés à cordes:

my %a = '1' => 'foo', 2 => 'bar'; 

say %a.pairs.perl; # ("1" => "foo", "2" => "bar").Seq 

Notez comment la deuxième clé est devenue la chaîne "2", même si elle a été passée à la Hash comme un entier .
Lorsque vous ne regardez-ups hachage, l'indice est également converti automatiquement en une chaîne avant qu'il ne soit utilisé:

say %a{"2"}.perl; # "bar" 
say %a{2}.perl;  # "bar" 

Notez comment l'indice 2 constaté à juste titre l'élément avec la clé "2". La conversion des entiers en chaînes est bien définie en Perl 6, ce qui donne une chaîne unique pour chaque entier unique, donc l'exemple que vous avez donné est correct.


Si vous ne pas voulez que vos clés de hachage à convertir en chaînes, vous pouvez remplacer la gestion des clés en utilisant la notation {} dans la déclaration:

my %b{Any} = '1' => 'foo', 2 => 'bar'; 

say %b.pairs.perl; # ("1" => "foo", 2 => "bar").Seq 

say %b{"1"}.perl; # "foo" 
say %b{1}.perl;  # Any 

say %b{"2"}.perl; # Any 
say %b{2}.perl;  # "bar" 

Notez comment dans ce cas la seconde clé 2 reste un nombre entier, et en effectuant une recherche avec l'indice de chaîne "2" ne le trouve pas, et l'indice 1 ne trouve pas l'entrée avec la clé "1". Signifie %b{Any} signifie «accepter les clés de n'importe quel type, et ne pas les contraindre». Ceci est parfois appelé 'object Hash' car il peut être mappé de n'importe quel objet à une valeur.

%b{Int} signifierait "n'accepte que les clés Int, et ne les force pas". Dans ce cas, vous obtiendrez une erreur si vous essayez même d'utiliser tout ce qui n'est pas déjà Int.