反转需要一对?

时间:2019-02-18 18:35:48

标签: perl6

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中缺少)。但是源代码不允许任何模棱两可的解释。我在这里想念什么吗?

2 个答案:

答案 0 :(得分:5)

也许您打算使用reverse方法。好吧,如果您希望结果为(2,3,1)

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

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

答案 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)

在列表上,它可以通过以下两种方式之一进行操作。

  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. 它可以像当前一样遍历列表中的每个对。

    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)