1. ホーム
  2. perl

[解決済み] なぜPerl 5の関数プロトタイプはダメなのか?

2022-09-13 22:58:55

質問

別のStack Overflowの質問 Leon Timmermans は断言しました。

私はプロトタイプを使わないように助言します。用途はありますが、ほとんどのケースではありませんし、間違いなくこのケースでもありません。

なぜこれが真実(またはそうでない)かもしれないのでしょうか?私はほとんど常に自分の Perl 関数にプロトタイプを供給していますし、他の誰かがそれを使用することについて何か悪いことを言うのを見たことがありません。

どのように解決するのですか?

プロトタイプは正しく使用すれば悪いものではありません。困難なのは、Perl のプロトタイプが、人々がしばしば期待するようには機能しないことです。他のプログラミング言語のバックグラウンドを持つ人々は、プロトタイプが、関数呼び出しが正しいことをチェックするメカニズムを提供することを期待する傾向があります。Perlのプロトタイプはこのタスクに適していません。それは 誤用 が悪いのです。Perl のプロトタイプは、唯一の、そして非常に異なる目的を持っています。

プロトタイプは、組み込み関数のように振る舞う関数を定義することを可能にします。

  • 括弧は省略可能です。
  • コンテキストは引数に課されます。

例えば、このような関数を定義することができます。

sub mypush(\@@) { ... }

と呼び、それを

mypush @array, 1, 2, 3;

を記述することなく \ を記述して配列への参照を取る必要はありません。

一言で言えば、プロトタイプはあなた自身の構文解析を可能にします。例えば、Mooseフレームワークは、より典型的なOO構文をエミュレートするためにそれらを使用します。

これは非常に便利ですが、プロトタイプは非常に限定的です。

  • コンパイル時に可視化されていなければならない。
  • バイパスすることができます。
  • 引数にコンテキストを伝搬させると、予期せぬ動作をすることがあります。
  • 厳密に規定された形式以外のものを使って関数を呼び出すことを困難にすることがあります。 厳密に規定された形式以外での関数の呼び出しを困難にします。

参照 プロトタイプ を参照してください。