当通过 `for` 循环时,数组保持数组
Array stays array when looped through `for`
我正在从 META6.json
循环遍历 depends
数组。我已经使用 JSON::Fast
加载到 Hash
。然而,当我使用 for
循环遍历它时,它只经过一次循环,并且项目是同一个数组:
use JSON::Fast;
my %meta = from-json(slurp("META6.json"));
for %meta<depends> -> $dependency {
dd $dependency;
}
这段代码returns
Array $dependency = $["Config::Parser::toml:ver<1.0.1+>", "Config:api<1>:ver<1.3.5+>", "Dist::Helper:ver<0.21.0+>", "Hash::Merge", "Terminal::Getpass:ver<0.0.5+>", "zef"]
我希望它循环 %meta<depends>
6 次,每次迭代都包含该数组中的不同元素。
为了更好地衡量,这是示例中 dd %meta<depends>
的输出:
Array %meta = $["Config::Parser::toml:ver<1.0.1+>", "Config:api<1>:ver<1.3.5+>", "Dist::Helper:ver<0.21.0+>", "Hash::Merge", "Terminal::Getpass:ver<0.0.5+>", "zef"]
为什么循环没有按我预期的方式循环?
编辑:我正在使用最新的 Rakudo Star:
This is Rakudo Star version 2018.04.1 built on MoarVM version 2018.04.1
implementing Perl 6.c.
即使 %meta<depends>
包含一个 Array
,它也包含在一个项目(容器)中。 for
语句查看并决定只有 1 件事要迭代(容器)。
这很容易补救:通过添加后缀 .list
,您将项目转换为某种东西 Iterable
,因此它将遍历容器中的 Array
:
for %meta<depends>.list -> $dependency {
一个稍微短一点的语法是 @()
:
for @(%meta<depends>) -> $dependency {
编辑:或使用 jjmerelo 建议的语法,它对元素进行去容器化,从而将底层 Array
暴露给 for
:
for %meta<depends><> -> $dependency {
这是一个陷阱。本质上是这样的:
my $var = ['a', 'b', 'c'];
for $var -> $v {
dd $v;
}
这给你:$["a", "b", "c"]
如果您使用 @sigil 迭代一个数组,它已经充当一个数组,但是当您在标量中有一个列表时,它将 return 数组而不是在其中迭代。
解决方案是使用 .list
使其充当列表而不是标量。
我正在从 META6.json
循环遍历 depends
数组。我已经使用 JSON::Fast
加载到 Hash
。然而,当我使用 for
循环遍历它时,它只经过一次循环,并且项目是同一个数组:
use JSON::Fast;
my %meta = from-json(slurp("META6.json"));
for %meta<depends> -> $dependency {
dd $dependency;
}
这段代码returns
Array $dependency = $["Config::Parser::toml:ver<1.0.1+>", "Config:api<1>:ver<1.3.5+>", "Dist::Helper:ver<0.21.0+>", "Hash::Merge", "Terminal::Getpass:ver<0.0.5+>", "zef"]
我希望它循环 %meta<depends>
6 次,每次迭代都包含该数组中的不同元素。
为了更好地衡量,这是示例中 dd %meta<depends>
的输出:
Array %meta = $["Config::Parser::toml:ver<1.0.1+>", "Config:api<1>:ver<1.3.5+>", "Dist::Helper:ver<0.21.0+>", "Hash::Merge", "Terminal::Getpass:ver<0.0.5+>", "zef"]
为什么循环没有按我预期的方式循环?
编辑:我正在使用最新的 Rakudo Star:
This is Rakudo Star version 2018.04.1 built on MoarVM version 2018.04.1
implementing Perl 6.c.
即使 %meta<depends>
包含一个 Array
,它也包含在一个项目(容器)中。 for
语句查看并决定只有 1 件事要迭代(容器)。
这很容易补救:通过添加后缀 .list
,您将项目转换为某种东西 Iterable
,因此它将遍历容器中的 Array
:
for %meta<depends>.list -> $dependency {
一个稍微短一点的语法是 @()
:
for @(%meta<depends>) -> $dependency {
编辑:或使用 jjmerelo 建议的语法,它对元素进行去容器化,从而将底层 Array
暴露给 for
:
for %meta<depends><> -> $dependency {
这是一个陷阱。本质上是这样的:
my $var = ['a', 'b', 'c'];
for $var -> $v {
dd $v;
}
这给你:$["a", "b", "c"]
如果您使用 @sigil 迭代一个数组,它已经充当一个数组,但是当您在标量中有一个列表时,它将 return 数组而不是在其中迭代。
解决方案是使用 .list
使其充当列表而不是标量。