反转需要一对?

问题描述 投票:5回答:2

列表的invert方法应该返回反转序列,或者至少是源代码所暗示的。然而:

say (1,3,2).invert 

失败了:

(exit code 1) Type check failed in invert; expected Pair but got Int (1)␤  in block <unit>

文档没有帮助,因为它是该区域的LTA(并且缺少List)。但源代码不承认任何含糊不清的解释。这里有什么我想念的吗?

perl6
2个回答
5
投票

也许你打算使用reverse方法。好吧,如果你想要结果是(2,3,1)

看起来List.invert的文档确实缺失了。它仅适用于由Lists组成的Pair。我现在就写下来。

编辑:doc添加了https://github.com/perl6/doc/commit/0ee3245776


4
投票

在Perl6中,运算符子例程和方法对于给定名称具有单一目的。

在中缀+运算符的情况下,它是添加两个数字。因此,如果给出的东西不是数字,它会在添加之前尝试将其转换为数字。

.invert方法的情况下,其基本目的是反转Pair对象。那是交换.key和一对的.value

因此,无论在哪个地方使用.invert,它都会以最像反转Pair对象的方式实现。


在具有单个.value的Pair对象上,它交换键和值。

say ('a' => 'A').invert;
# (A => a)

如果.value不是单数,它会给你一个序列,其中每个值现在是它自己的Pair的关键。

say ('a' => ('A', 'B')).invert;
# (A => a B => a)

请注意,.invert始终返回一致的序列。即使在第一个例子。

在哈希上,它在所有键/值对上执行。

say %( 'a' => ('A','B'), 'b' => 'B', 1 => 'A' ).invert.sort;
# (A => 1 A => a B => a B => b)

在列表中,它可以通过两种方式之一完成。

  1. 它可以使用索引作为关键,就像.antipairs一样。 say ( 'a' => ('A','B'), 'b' => 'B', 1 => 'A' ).antipairs.sort; # ((1 => A) => 2 (a => (A B)) => 0 (b => B) => 1) say ( 'a', 'b', 'c' ).antipairs; # (a => 0 b => 1 c => 2)
  2. 它可以像目前一样遍历列表中的每个Pairs。 say ( 'a' => ('A','B'), 'b' => 'B', 1 => 'A' ).invert.sort (A => 1 A => a B => a B => b)

由于.antipairs已经像.pairs一样工作,除了相反之外,.invert确实没有理由像它一样工作。这也会使.invert不像Pair方法。

这也有很好的效果,你可以从一个哈希作为一个列表获得对,然后在它上面调用.invert,它就像在Hash上直接调用.invert一样。

say %( 'a' => ('A','B'), 'b' => 'B', 1 => 'A' ).invert.sort;
# (A => 1 A => a B => a B => b)

say %( 'a' => ('A','B'), 'b' => 'B', 1 => 'A' ).list.invert.sort;
# (A => 1 A => a B => a B => b)

这也意味着您可以多次调用.invert并保持一致。

say %( 'a' => ('A','B'), 'b' => 'B', 1 => 'A' ).invert.invert.invert.sort;
# (A => 1 A => a B => a B => b)
© www.soinside.com 2019 - 2024. All rights reserved.