Lists的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中缺少)。但是源代码不允许任何模棱两可的解释。我在这里想念什么吗?
答案 0 :(得分:5)
也许您打算使用reverse方法。好吧,如果您希望结果为(2,3,1)
。
看来List.invert
的文档确实丢失了。它仅适用于由List
组成的Pair
。我现在就写出来。
答案 1 :(得分: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)
在列表上,它可以通过以下两种方式之一进行操作。
它可以像使用.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
,就像直接在哈希表上调用.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)