作者:手浪用户2602890763 | 来源:互联网 | 2023-01-30 12:37
使用整数作为哈希键是否安全?
my %hash;
my $str = ...
for $str.NFC {
%hash{$_} = ...
}
smls..
5
一个正常的Hash
胁迫其所有键的字符串:
my %a = '1' => 'foo', 2 => 'bar';
say %a.pairs.perl; # ("1" => "foo", "2" => "bar").Seq
注意第二个键如何成为字符串"2"
,即使它最初作为整数传递给Hash.
当您进行哈希查找时,下标在使用之前也会自动转换为字符串:
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"
查找时找不到它,下标也没有找到1
带键的条目"1"
.
%b{Any}
意思是"接受任何类型的钥匙,不要强迫它们".这有时称为" 对象哈希 ",因为它可以从任何对象映射到值.
%b{Int}
意思是"只接受Int
钥匙,不要强迫他们".在这种情况下,如果您甚至尝试使用任何尚未使用的内容,您将收到错误消息Int
.
1> smls..:
一个正常的Hash
胁迫其所有键的字符串:
my %a = '1' => 'foo', 2 => 'bar';
say %a.pairs.perl; # ("1" => "foo", "2" => "bar").Seq
注意第二个键如何成为字符串"2"
,即使它最初作为整数传递给Hash.
当您进行哈希查找时,下标在使用之前也会自动转换为字符串:
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"
查找时找不到它,下标也没有找到1
带键的条目"1"
.
%b{Any}
意思是"接受任何类型的钥匙,不要强迫它们".这有时称为" 对象哈希 ",因为它可以从任何对象映射到值.
%b{Int}
意思是"只接受Int
钥匙,不要强迫他们".在这种情况下,如果您甚至尝试使用任何尚未使用的内容,您将收到错误消息Int
.