为什么Perl 6的Map在一个案例中给我一个值,在另一个案例中给一个列表?

时间:2017-05-22 02:30:58

标签: perl6 raku

我正在玩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

1 个答案:

答案 0 :(得分:3)

当您访问这样的关联值时,编译器可以告诉它只需要返回一个值。

$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>只是两个功能的组合。

  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
    
  2. 关联索引:

    %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]

有几种解决方法。

  1. 实际上使用超级后缀

    $m<<$n>>>>.[0]
    $m<<$n>>».[0]
    
  2. 使用一个空格。 (永远不能在运算符内部,所以会拆分它们)

    $m<<$n>>\.[0]
    $m<<$n>>\     .[0]
    

我认为这是一个错误,因为在quotewords语句中匹配超级后缀没有多大意义。
(它不会影响$m<<1>>.elems