В 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)
В списке это может быть сделано одним из двух способов.
Он может использовать индекс в качестве ключа, точно так же, как .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)