使用整数作为散列键是否安全?
Is it safe to use integers as hash keys?
使用整数作为哈希键是否安全?
my %hash;
my $str = ...
for $str.NFC {
%hash{$_} = ...
}
普通的 Hash
将其所有键强制转换为字符串:
my %a = '1' => 'foo', 2 => 'bar';
say %a.pairs.perl; # ("1" => "foo", "2" => "bar").Seq
注意第二个键如何变成字符串 "2"
,即使它最初是作为整数传递给哈希的。
当你做hash look-ups的时候,下标在使用之前也会自动转换成字符串:
say %a{"2"}.perl; # "bar"
say %a{2}.perl; # "bar"
请注意下标 2
如何正确找到具有键 "2"
的元素。
从整数到字符串的转换在 Perl 6 中定义明确,为每个唯一的整数生成一个唯一的字符串,因此您给出的示例很好。
如果您不希望您的哈希键被转换为字符串,您可以在声明中使用{}
符号覆盖键处理:
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"
请注意,在这种情况下,第二个键 2
是如何保持整数的,使用字符串下标 "2"
进行查找并没有找到它,下标 [=20= 也没有] 找到键为 "1"
.
的条目
%b{Any}
表示 "accept keys of any type, and don't coerce them"。这有时称为“object Hash”,因为它可以从任何对象映射到一个值。
%b{Int}
表示 "accept only Int
keys, and don't coerce them"。在这种情况下,如果您尝试使用任何尚未 Int
.
的内容,您都会收到错误消息
使用整数作为哈希键是否安全?
my %hash;
my $str = ...
for $str.NFC {
%hash{$_} = ...
}
普通的 Hash
将其所有键强制转换为字符串:
my %a = '1' => 'foo', 2 => 'bar';
say %a.pairs.perl; # ("1" => "foo", "2" => "bar").Seq
注意第二个键如何变成字符串 "2"
,即使它最初是作为整数传递给哈希的。
当你做hash look-ups的时候,下标在使用之前也会自动转换成字符串:
say %a{"2"}.perl; # "bar"
say %a{2}.perl; # "bar"
请注意下标 2
如何正确找到具有键 "2"
的元素。
从整数到字符串的转换在 Perl 6 中定义明确,为每个唯一的整数生成一个唯一的字符串,因此您给出的示例很好。
如果您不希望您的哈希键被转换为字符串,您可以在声明中使用{}
符号覆盖键处理:
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"
请注意,在这种情况下,第二个键 2
是如何保持整数的,使用字符串下标 "2"
进行查找并没有找到它,下标 [=20= 也没有] 找到键为 "1"
.
%b{Any}
表示 "accept keys of any type, and don't coerce them"。这有时称为“object Hash”,因为它可以从任何对象映射到一个值。
%b{Int}
表示 "accept only Int
keys, and don't coerce them"。在这种情况下,如果您尝试使用任何尚未 Int
.