如何在 Perl 6 中制作哈希数组?
How to make an array of hashes in Perl 6?
如何使已被推入array
的hash
独立于"source"hash
?
my %country;
my Hash @array;
%country{ 'country' } = 'France';
@array.push(%country);
%country{ 'country' } = 'Germany';
@array.push(%country);
.say for @array;
输出为:
{country => Germany}
{country => Germany}
当然这不是我想要的。
几乎所有编程语言都有这个问题。您不止一次将相同的哈希值推送到数组中。当您更改散列时,您更改了数组内的两个引用。
如果将不同的哈希值压入数组,您将看到预期的结果:
my %a = ( country => 'China' );
my %b = ( country => 'USA' );
my Hash @array;
@array.push(%a);
@array.push(%b);
say @array.perl;
您甚至可以在将散列推送到数组时复制散列,而不是声明两个散列。这也将解决这个问题:
my %country;
my @array;
%country<country> = 'México';
@array.push(%country.list.hash);
%country<country> = 'Canada';
@array.push(%country.list.hash);
say @array.perl;
顺便说一句,复制散列的方法有很多种。关键是获取 key/values,然后将其转回哈希。使用哪种哈希构造函数以及使用哪种展平方法由您决定。 (.kv
、.list
、.pairs
、.flat
都是 Hash
方法,它们将以一种或另一种方式顺序获取元素。Håkon 展示的方式是更隐含,获取元素然后单独通过语法创建另一个散列。)
当您将散列 %country
推送到数组时,您将引用推送到 %country
。这样,每个数组元素都会引用同一个原始散列%country
。当您更改哈希的值时,所有数组元素都将反映此更改(因为它们都引用相同的哈希)。如果你想在每次推送时都创建一个新的哈希,你可以尝试推送一个匿名哈希。例如:
%country{ 'country' } = 'France';
@array.push({%country});
%country{ 'country' } = 'Germany';
@array.push({%country});
这样,每次都会推送对 %country
副本的引用(而不是对 %country
的引用)。
输出:
{country => France}
{country => Germany}
如果您只想要一个简单的键值对(而不是多部分散列),请考虑 Pairs?
my Pair @array;
@array.push( (:country<Germany>) );
@array.push( (country => "France") );
say @array;
say .kv for @array
如何使已被推入array
的hash
独立于"source"hash
?
my %country;
my Hash @array;
%country{ 'country' } = 'France';
@array.push(%country);
%country{ 'country' } = 'Germany';
@array.push(%country);
.say for @array;
输出为:
{country => Germany}
{country => Germany}
当然这不是我想要的。
几乎所有编程语言都有这个问题。您不止一次将相同的哈希值推送到数组中。当您更改散列时,您更改了数组内的两个引用。
如果将不同的哈希值压入数组,您将看到预期的结果:
my %a = ( country => 'China' );
my %b = ( country => 'USA' );
my Hash @array;
@array.push(%a);
@array.push(%b);
say @array.perl;
您甚至可以在将散列推送到数组时复制散列,而不是声明两个散列。这也将解决这个问题:
my %country;
my @array;
%country<country> = 'México';
@array.push(%country.list.hash);
%country<country> = 'Canada';
@array.push(%country.list.hash);
say @array.perl;
顺便说一句,复制散列的方法有很多种。关键是获取 key/values,然后将其转回哈希。使用哪种哈希构造函数以及使用哪种展平方法由您决定。 (.kv
、.list
、.pairs
、.flat
都是 Hash
方法,它们将以一种或另一种方式顺序获取元素。Håkon 展示的方式是更隐含,获取元素然后单独通过语法创建另一个散列。)
当您将散列 %country
推送到数组时,您将引用推送到 %country
。这样,每个数组元素都会引用同一个原始散列%country
。当您更改哈希的值时,所有数组元素都将反映此更改(因为它们都引用相同的哈希)。如果你想在每次推送时都创建一个新的哈希,你可以尝试推送一个匿名哈希。例如:
%country{ 'country' } = 'France';
@array.push({%country});
%country{ 'country' } = 'Germany';
@array.push({%country});
这样,每次都会推送对 %country
副本的引用(而不是对 %country
的引用)。
输出:
{country => France}
{country => Germany}
如果您只想要一个简单的键值对(而不是多部分散列),请考虑 Pairs?
my Pair @array;
@array.push( (:country<Germany>) );
@array.push( (country => "France") );
say @array;
say .kv for @array