列表的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)。但源代码不承认任何含糊不清的解释。这里有什么我想念的吗?
也许你打算使用reverse方法。好吧,如果你想要结果是(2,3,1)
。
看起来List.invert
的文档确实缺失了。它仅适用于由List
s组成的Pair
。我现在就写下来。
在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)
在列表中,它可以通过两种方式之一完成。
.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)
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)