为什么 Perl 6 的 Map 在一种情况下给我一个值而在另一种情况下给我一个列表?
Why does Perl 6's Map give me a value in one case and a list in another?
我正在玩 Map,我得到了一个我不明白的结果。
首先,我构建 Map。没什么大不了的:
> my $m = Map.new: '1' => :1st, '2' => :2nd;
Map.new(("1" => :st(1),"2" => :nd(2)))
我通过文字键访问单个元素并返回一对:
> $m<1>.^name
Pair
> $m<<1>>.^name
Pair
没关系。
如果我尝试使用变量中的键,我会返回 List:
> my $n = 1
1
> $m<<$n>>.^name
List
该列表具有正确的值,但为什么在那种情况下我得到的是 List 而不是 $m<<1>>
的情况?
而且,一旦我有了列表,我似乎无法将另一个下标链接到它:
> $m<<$n>>.[0]
===SORRY!=== Error while compiling:
Unable to parse quote-words subscript; couldn't find right double-angle quote
at line 2
当您像这样访问关联值时,编译器会告诉它它只需要 return 一个值。
$m< 1 >
$m<< 1 >>
在 Perl 6 中,奇异值在许多情况下的行为就像一个值的列表。
42.elems == 1 # True
42.[0] =:= 42 # True
在以下情况下,编译器无法立即判断它只会产生一个值:
my $n = 1;
$m<< $n >>;
因为它可以产生 2 个值:
my $o = '1 2';
$m<< $o >>;
如果希望字符串是单个键,则必须使用引号。
$m<< "$o" >>
或者使用更合适的{}
$m{ $n }
$m<1>
只是两个特征的组合。
引用词:( qw<>
和 qqww<<>>
)
< a b c > eqv ("a", "b", "c")
< "a b" c > eqv (「"a」, 「b"」, "c") # three strings
<< a b c >> eqv ("a", "b", "c")
<< "a b" c >> eqv ("a b", "c") # two strings
关联索引:
%h< a b c > eqv %h{ < a b c > }
%h<< "a b" c >> eqv %h{ << "a b" c >> }
我现在也得到了不同的值。
$m< 1 >.WHAT =:= Pair
$m<< 1 >>.WHAT =:= Pair
$m<< $n >>.WHAT =:= Pair # different
$m<< $o >>.WHAT =:= List
$m<<$n>>.[0]
不起作用的原因是编译器认为您使用的是超级后缀 >>.[0]
。
有几种方法可以解决这个问题。
实际使用超级后缀
$m<<$n>>>>.[0]
$m<<$n>>».[0]
使用非空格。 (永远不能在运算符内部,所以将它们分开)
$m<<$n>>\.[0]
$m<<$n>>\ .[0]
我认为这是一个错误,因为在 quotewords 语句中匹配超级后缀没有多大意义。
(不影响$m<<1>>.elems
)
我正在玩 Map,我得到了一个我不明白的结果。
首先,我构建 Map。没什么大不了的:
> my $m = Map.new: '1' => :1st, '2' => :2nd;
Map.new(("1" => :st(1),"2" => :nd(2)))
我通过文字键访问单个元素并返回一对:
> $m<1>.^name
Pair
> $m<<1>>.^name
Pair
没关系。
如果我尝试使用变量中的键,我会返回 List:
> my $n = 1
1
> $m<<$n>>.^name
List
该列表具有正确的值,但为什么在那种情况下我得到的是 List 而不是 $m<<1>>
的情况?
而且,一旦我有了列表,我似乎无法将另一个下标链接到它:
> $m<<$n>>.[0]
===SORRY!=== Error while compiling:
Unable to parse quote-words subscript; couldn't find right double-angle quote
at line 2
当您像这样访问关联值时,编译器会告诉它它只需要 return 一个值。
$m< 1 >
$m<< 1 >>
在 Perl 6 中,奇异值在许多情况下的行为就像一个值的列表。
42.elems == 1 # True
42.[0] =:= 42 # True
在以下情况下,编译器无法立即判断它只会产生一个值:
my $n = 1;
$m<< $n >>;
因为它可以产生 2 个值:
my $o = '1 2';
$m<< $o >>;
如果希望字符串是单个键,则必须使用引号。
$m<< "$o" >>
或者使用更合适的{}
$m{ $n }
$m<1>
只是两个特征的组合。
引用词:(
qw<>
和qqww<<>>
)< a b c > eqv ("a", "b", "c") < "a b" c > eqv (「"a」, 「b"」, "c") # three strings << a b c >> eqv ("a", "b", "c") << "a b" c >> eqv ("a b", "c") # two strings
关联索引:
%h< a b c > eqv %h{ < a b c > } %h<< "a b" c >> eqv %h{ << "a b" c >> }
我现在也得到了不同的值。
$m< 1 >.WHAT =:= Pair
$m<< 1 >>.WHAT =:= Pair
$m<< $n >>.WHAT =:= Pair # different
$m<< $o >>.WHAT =:= List
$m<<$n>>.[0]
不起作用的原因是编译器认为您使用的是超级后缀 >>.[0]
。
有几种方法可以解决这个问题。
实际使用超级后缀
$m<<$n>>>>.[0] $m<<$n>>».[0]
使用非空格。 (永远不能在运算符内部,所以将它们分开)
$m<<$n>>\.[0] $m<<$n>>\ .[0]
我认为这是一个错误,因为在 quotewords 语句中匹配超级后缀没有多大意义。
(不影响$m<<1>>.elems
)