【问题标题】:Why does Perl 6's Map give me a value in one case and a list in another?为什么 Perl 6 的 Map 在一种情况下给我一个值而在另一种情况下给我一个列表?
【发布时间】:2017-05-22 02:30:57
【问题描述】:

我在玩Map,结果我不明白。

首先,我构造了Map。没什么大不了的:

> my $m = Map.new: '1' => :1st, '2' => :2nd;
Map.new(("1" => :st(1),"2" => :nd(2)))

我通过文字键访问单个元素并返回一个 Pair:

> $m<1>.^name
Pair
> $m<<1>>.^name
Pair

没关系。

如果我尝试使用变量中的键,我会返回 List

> my $n = 1
1
> $m<<$n>>.^name
List

该列表具有正确的值,但为什么在这种情况下我得到 List 而不是 $m&lt;&lt;1&gt;&gt; 情况?

而且,一旦我有了列表,我似乎无法将另一个下标链接到它:

> $m<<$n>>.[0]
===SORRY!=== Error while compiling:
Unable to parse quote-words subscript; couldn't find right double-angle quote
at line 2

【问题讨论】:

  • 另一个((不)相关的?)不一致:say &lt;&lt;1&gt;&gt;.^name # IntStr vs my $n = 1; say &lt;&lt;$n&gt;&gt;.^name # Slip vs say &lt;&lt;1 2&gt;&gt;.^name # List
  • 在考虑了这个问题并与向我展示问题的人交谈后,我认为$m&lt;&lt;1&gt;&gt; 也应该返回一个列表。那么事情就说得通了。如果它是一个 IntStr 的列表,那很好。

标签: raku


【解决方案1】:

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

$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&lt;1&gt; 只是两个功能的组合。

  1. 引言:(qw&lt;&gt;qqww&lt;&lt;&gt;&gt;

    <   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&lt;&lt;$n&gt;&gt;.[0] 不起作用的原因是编译器认为您使用的是超后缀 &gt;&gt;.[0]

有几种方法可以解决这个问题。

  1. 其实是用超后缀

    $m<<$n>>>>.[0]
    $m<<$n>>».[0]
    
  2. 使用非空格。 (永远不能在操作员内部,所以将它们分开)

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

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

【讨论】:

  • 这是对现实的一个很好的解释。我仍然不喜欢编译器决定这一点的部分,而不是功能正常运行的结果。这就是为什么我经常对这些事情感到惊讶。
猜你喜欢
  • 2021-12-30
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 2022-12-01
  • 2013-12-28
相关资源
最近更新 更多