なぜ、このコードの両方のバージョンは、-c Perlのチェックを失敗しないのですか?
-
20-09-2019 - |
質問
new
のParse::RecDescent
方法は、このプロトタイプを持っています:
sub new ($$$)
{
# code goes here
}
と私はこのようなオブジェクトを作成する場合:
my $parser = Parse::RecDescent->new($grammar);
これは、パーサを作成し、この方法は、「解析:: RecDescentは」と$文法を、右の2つのパラメータを受け取ることができますか?私のようなオブジェクトを作成しようとした場合:
Parse::RecDescent::new("Parse::RecDescent",$grammar)
これは「::解析:: RecDescentのための新しい引数が足りません」と言っては失敗し、私はこのメッセージを理解しています。私は2つのパラメータを渡しています。矢印のバージョンが動作する理由しかし、私は理解していません。
あなたは説明できますか?
解決
関数のプロトタイプはチェックされません。また、あなたが&sub(arg0, arg1..);
のように、とサブを呼び出す&ときプロトタイプチェックをバイパス
からはperldocはperlsubするます:
「&」形式は引数リストをオプションに、それはまた、あなたが提供しない引数にチェックすべてのプロトタイプを無効にするだけではありません。これは、一部のためです 、そして部分的にカンニングする便利な方法を持つための歴史的な理由は、あなたがやっていることを知っていれば。以下のプロトタイプを参照してください。
呼ばれる正確なコードは、継承に依存するので、呼び出される関数は、コンパイル時に不定であるため、メソッドの呼び出しは、いずれかのプロトタイプの影響を受けない。
Parse::RecDescent::new("Parse::RecDescent", $grammar)
が構文的に正しいですが、、それはコンストラクタを呼び出すのはかなり臭いやり方だし、今はそれが(という祖先に比べて)、そのクラスに定義されていることを余儀なくされています。あなたが本当にあなたの引数を検証する必要がある場合は、メソッド内でそれを行う:
sub new
{
my ($class, @args) = @_;
die "Not enough arguments passed to constructor" if @args < 2;
# ...
}
も参照してください。プロトタイプでこの以前の質問はとなぜ彼らはそうではありません通常、このような素晴らしいアイデアます。