次のテストで true が返される配列があります。
1 ~~ @a
それでも、次のテストは false を返します。
@a ~~ 1
Learning Perlで、スマートマッチ演算子の両側の値の配置は問題ではないことを読みましたが、明らかに上記のコードでは重要です。何故ですか?2 つのステートメントは異なるものをチェックしていますか?
次のテストで true が返される配列があります。
1 ~~ @a
それでも、次のテストは false を返します。
@a ~~ 1
Learning Perlで、スマートマッチ演算子の両側の値の配置は問題ではないことを読みましたが、明らかに上記のコードでは重要です。何故ですか?2 つのステートメントは異なるものをチェックしていますか?
他の回答に加えて、Perl 5.10.1 の変更のリストには~~
、オペレーターに加えられた変更に関するセクションがあります。
スマートマッチ演算子
~~
は可換ではなくなりました。スマート マッチの動作は、主に右側の引数の型に依存するようになりました。
したがって、Perl の学習は、これらの変更の前に正しかった可能性があります。
5.10.0 の ~~ のバージョンは、交換可能な当時の perl6 設計に基づいていました。5.10.0 がリリースされるまでに非常に長い時間がかかったので、それがリリースされるまでに、perl6 のスマートマッチは大幅に改善されていました (交換可能でなくなったことも含めて)。これは 5.10.1 で修正されており、古い 5.10.0 ルールに頼るべきではありません。一貫性のない動作が印刷された本に文書化されたことは、私にとってニュースです。
Smart Matching in Detailに移動すると、引数の順序とタイプに応じて、動作が大きく異なることがわかります。
Learning Perlがそう言っているなら、それは時代遅れです (多くの場合、そのようにうまくいく傾向がありますが) 。スマート マッチング演算子が行うことは、主に右引数の型によって決まります。詳細については、perlsyn ドキュメントの表を参照してください。