[解決済み] なぜ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構文をエミュレートするためにそれらを使用します。
これは非常に便利ですが、プロトタイプは非常に限定的です。
- コンパイル時に可視化されていなければならない。
- バイパスすることができます。
- 引数にコンテキストを伝搬させると、予期せぬ動作をすることがあります。
- 厳密に規定された形式以外のものを使って関数を呼び出すことを困難にすることがあります。 厳密に規定された形式以外での関数の呼び出しを困難にします。
参照 プロトタイプ を参照してください。
関連
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] Bash関数にパラメータを渡す
-
[解決済み] 関数名を文字列として取得するには?
-
[解決済み] Perlからロケール設定の警告を修正する方法
-
[解決済み] 最近のPerlはなぜデフォルトでUTF-8を避けるのですか?
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】関数の前のエクスクラメーションマークは何をするのですか?
-
[解決済み】AngularJSのスコーププロトタイピング/プロトタイピング継承のニュアンスとは?
-
[解決済み] PerlからUTF-8を出力するにはどうしたらいいですか?
-
[解決済み] Perlでファイルが存在するかどうかを確認するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン