Perl6-オペレーターのオーバーロード

1. Perl6で変数とリテラルを操作する機能

2. Perl6-変数の操作、匿名ブロック

3. Perl6-条件付きステートメント、ループ

4. Perl6-関数を使用する

5. Perl6-クラス

6. Perl6-I / Oモジュール

7. Perl6-コメント、空白、括弧

関数とその使用機能に関する記事をすでに書いたことがあります(4)。 次に、それらの種類の1つである演算子を検討します。





おそらく中置演算子から始めます:

中置演算子の例は、「+」演算子です。

sub infix:<MyNewOperator> (Int $a, Str $b) { return "Call: $a + $b"; } say 10 MyNewOperator "abc";
      
      





その結果、画面に表示されます

 Call: 10 + abc
      
      





ご覧のとおり、C ++のように演算子名に制限はありません-「MyNewOperator」を「+」に変更するだけで、新しい演算子を追加したり、既存の演算子を変更したりできます。 その結果、2つの文字列をキャストして接着する代わりに、指定した形式の文字列を生成する加算演算子を取得します。



また、実験のために、中置演算子に3番目の引数を追加しようとしましたが、そのような演算子は正常にコンパイルされましたが、そのような演算子を呼び出す唯一の方法は通常の関数の呼び出しと変わりません:

 sub infix:<MyNewOperator> (Int $a, Str $b, $c) { return "Call: $a + $b, $c"; } say infix:<MyNewOperator>(1, "abc", 5);
      
      





演算子を作成する意味がわからないので、そのような使用法を使用していないので、今後は「パラメーターシグネチャ」から逸脱することはありません。



次のタイプの演算子である接頭辞に進みましょう。

良い例は、論理式「!」の否定演算子です。 整数の検証のためにオーバーロードします

 sub prefix:<!> (Int $a) { return "Call: prefix ! $a"; } say !1;
      
      





また、既存のプレフィックス演算子の名前に限定されないことにも注意してください。 したがって、演算子 '。'をオーバーロードすることさえできました。これにより、そのような演算子の習慣に非常に珍しい外観が作成されました。 この機会に、どこかで読んだコミックフレーズを思い出しました。「Perl6では、演算子、ブロック、すべて、さらにはオーバーロードをオーバーロードできます」。 shuktaを使ったジョークですが、プレフィックス演算子のドットが何らかの理由で=)と思うようになります



しかし、他のものに移る時が来ました-後置演算子:

繰り返しになりますが、小さな活字と1つの銀行に関する1つの記事を思い出しました。

 sub postfix:<*> (Int $a) { return "See $a paragraph in document A"; } say "We can give you \$1_000_000 just for lulz!"; say 1*;
      
      







その結果、表示されます

 We can give you $1_000_000 just for lulz! See 1 paragraph in document A
      
      







繰り返しますが、前述のすべてのタイプの演算子に関して、実際、演算子の名前は、コンパイラが演算子の終了位置とオペランドの開始位置を理解する必要があるという事実に限定されています。 そのため、演算子の名前を選択するときに特に洗練されないでください。

最後に、続行する前に、演算子が実際に同じ関数であることを忘れないでください。したがって、文字列に対して別の同じ後置演算子 '*'を作成する場合は、両方の場合にキーワード 'multi'を追加する必要があります。



しかし、次のカテゴリ-オーバーロードブラケットに進みます。

 sub circumfix:<(( ))> (Int $a) { return "<$a>"; } say ((1));
      
      







結果として、

 <1>
      
      







しかし、「新しい」括弧を選択するときは賢くはいけません。コンパイラーはすべてそれをかき集めなければならず、演算子のリストへの介入のため、これはそれほど単純ではないかもしれません=)



ただし、次のタイプである「後置括弧」に進みます

どのようにコンパイラに文字列または数値のこの演算子をオーバーロードさせようとしても、メソッドには単純にそのようなメソッドがないというメッセージが表示されました。 また、インターネットで見つけた例は、クラスのメソッドの形式でフレーム化されました。 このことから、これは新しいクラスを作成する場合にのみ実行できると想定できるため、ここでは次の記事まで次の例を使用しますが、興味がある場合は、このトピックでコンパイラを試すことができます。



最後に、関数による戻り値の型の作業チェックに気づいたことを付け加えました。

 sub Func($a) of Int { return $a; }
      
      





関数は任意のタイプのオペランドを受け入れることができるという事実にもかかわらず、整数ではなく文字列や小数値などが送信されると、実行時に値を返すときにエラーが発生します。 覚えている限りでは、前回チェックしたとき、この機能は動作しませんでした。



これで私はこの記事を終了したいと思います、私はあなたがそれを楽しんだことを望みます。



All Articles