Инверт нужна пара? - PullRequest
       10

Инверт нужна пара?

0 голосов
/ 18 февраля 2019

Метод invert для списков должен возвращать инвертированную последовательность, или, по крайней мере, это то, что источник подразумевает.Однако:

say (1,3,2).invert 

завершается неудачно с:

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

Документация не помогает, потому что это LTA в этой области (и отсутствует для списка).Но исходный код не допускает никакой двусмысленной интерпретации.Я что-то упускаю здесь?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

В Perl6 подпрограммы и методы операторов имеют единственное назначение для заданного имени.

В случае оператора infix + это добавление двух чисел.Поэтому, если ему дается что-то, что не является числом, он пытается превратить его в число перед добавлением.

В случае метода .invert его фундаментальное назначение - инвертироватьПарный объект.То есть поменяйте местами .key и .value пары.

Таким образом, везде, где можно использовать .invert, это происходит так же, как инвертированиеОбъект Pair.


Для объекта Pair с единственным числом .value он меняет ключ и значение.

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

Если .value не является единственным, он даетВы последовательность, в которой каждое значение теперь является ключом своей собственной пары.

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)
0 голосов
/ 18 февраля 2019

Возможно, вы намеревались использовать метод reverse .Ну, если вы хотите, чтобы результат был (2,3,1).

Похоже, документация по List.invert действительно отсутствует.Он предназначен для работы только на List, который состоит из Pair с.Я напишу это сейчас.

РЕДАКТИРОВАТЬ: документ добавлен с https://github.com/perl6/doc/commit/0ee3245776

...