Почему smartmatch возвращает разные значения в зависимости от порядка операндов? - PullRequest
9 голосов
/ 12 марта 2011

У меня есть массив, для которого следующий тест возвращает true:

1 ~~ @a

И все же, следующий тест возвращает false:

@a ~~ 1

Я прочитал в Learning Perl что размещение значений по обе стороны от оператора smartmatch не имеет значения, но, очевидно, в приведенном выше коде это имеет значение.Это почему?Проверяют ли два утверждения разные вещи?

Ответы [ 4 ]

13 голосов
/ 12 марта 2011

В дополнение к другим ответам, список изменений в Perl 5.10.1 содержит раздел об изменениях, внесенных в оператор ~~:

Оператор интеллектуального сопоставления~~ больше не является коммутативным.Поведение интеллектуального сопоставления теперь зависит в первую очередь от типа его правого аргумента.

Так что Изучение Perl могло быть правильным до этих изменений.

11 голосов
/ 12 марта 2011

Версия ~~ в 5.10.0 была основана на тогдашнем проекте perl6, который был коммутативным.Поскольку выпуск 5.10.0 занял очень много времени, к тому времени, когда он вышел, smartmatch perl6 был значительно улучшен (в том числе больше не был коммутативным), но никто в разработке perl5 не заметил вовремя, чтобы исправить реализацию perl5.Это было исправлено в 5.10.1, и никто не должен полагаться на старые правила 5.10.0.Для меня новость, что противоречивое поведение задокументировано в печатной книге.

5 голосов
/ 12 марта 2011

Вы можете увидеть, что он делает очень разные вещи в зависимости от порядка и типов своих аргументов, если перейти к Smart Matching in Detail .

5 голосов
/ 12 марта 2011

Если Learning Perl говорит, что это неправильно устарело (хотя во многих случаях это действительно срабатывает). То, что делает умный оператор сопоставления, в основном определяется типом правильного аргумента; подробности см. в таблице документации perlsyn .

...