Perl 6とスマートマッチング

Perl 6のシーケンス演算子に関する記事を覚えていますか?



最後の引数では、シーケンスの生成を停止する制約を受け入れます。 例えば



1, 2, 4 ... 32; # 1 2 4 8 16 32 1, 2, 4 ... * > 10; # 1 2 4 8 16
      
      







最初のケースでは、数値比較が使用されます。 2番目のエントリでは、*> 10はクロージャとして解釈されます-> $ x {$ x> 10}。



シーケンス演算子は、一致のタイプに応じて「マジック」比較を実行します。 この比較はスマートマッチングと呼ばれ、この概念はPerl 6の多くの場所に現れています。例:



  #    'when': given $age { when 100 { say "!" } when * < 18 { say " " } } #  'where': subset Even of Int where * %% 2; #    smartmatch: if $input ~~ m/^\d+$/ { say "$input –  "; } #   grep(), first()  ..: my @even = @numbers.grep: Even;
      
      







~~の右側で、比較された値が$ _から取得されるタイミングと場所の後。 これにより、m /.../および.method_callを使用して作成されたレギュラーなど、$ _で機能する構造を作成できます。



演算子の使用例:



  #     Str? $foo ~~ Str #    6? $foo ~~ 6 #   "bar"? $foo ~~ "bar" #   ? $foo ~~ / \w+ '-' \d+ / #    15  25? $foo ~~ (15..25) #   $foo ~~ -> $x { say 'ok' if 5 < $x < 25 } #      6 ,       1? $foo ~~ [1, *, 1, *, 1, *]
      
      







オペレーターの詳細テーブル



Perl 5とは異なり、Perl 6ではスマートマッチングが何かを通常のものと比較する唯一の方法であることに注意してください。これには特別な演算子はありません。 さらに、ほとんどのスマートマッチング操作はBoolを返しますが、規則性との比較はMatchオブジェクトを返します。 同時に、ブールコンテキストで正しく動作します。



さて、しかし、これを組み込み型ではなく、独自のクラスで使用する方法は? これを行うには、ACCEPTSという特別なメソッドを作成します。 古き良きPointクラスがあるとしましょう:



  class Point { has $.x; has $.y; method ACCEPTS(Positional $p2) { return $.x == $p2[0] and $.y == $p2[1] } }
      
      







いいですか 仕組みを見てみましょう。



  my $a = Point.new(x => 7, y => 9); say [3, 5] ~~ $a; # Bool::False say (7, 9) ~~ $a; # Bool::True
      
      







これで、Perl 6は、独自のクラスであっても、ユーザーが念頭に置いていたものを正確に実行できます。



All Articles