Frage

Die new Methode von Parse::RecDescent hat diesen Prototyp:

sub new ($$$)
{
   # code goes here
}

, und wenn ich ein Objekt erstellen wie folgt:

my $parser = Parse::RecDescent->new($grammar);

wird es einen Parser erstellen, und das Verfahren erhalten werden 2 Parameter „Parse :: RecDescent“ und $ Grammatik, nicht wahr? Wenn ich versuche, ein Objekt wie zu erstellen:

Parse::RecDescent::new("Parse::RecDescent",$grammar)

Dies wird fehlschlagen „Nicht genügend Argumente für Parse :: RecDescent :: neu“, und ich verstehe diese Nachricht zu sagen. Ich bin vorbei nur zwei Parameter. Aber ich verstehe nicht, warum die Pfeil-Version funktioniert.

Können Sie das erklären?

War es hilfreich?

Lösung

Funktionsprototypen werden nicht überprüft, wenn Sie es als OO-Stil-Methode aufrufen. Darüber hinaus Bypass Sie Prototyp Prüfung beim Aufruf eines Unter mit &, wie in &sub(arg0, arg1..);

Perldoc perlsub :

  

Nicht nur die „&“ bilden die Argumentliste optional machen, deaktiviert er auch jede Prototyp Prüfung auf Argumente, die Sie zur Verfügung stellen können. Dies ist zum Teil für   historische Gründe und zum Teil eine bequeme Möglichkeit für mit zu betrügen, wenn Sie wissen, was du tust. Siehe Prototypen unten.

     

Methodenaufrufe werden nicht von Prototypen entweder beeinflusst, da die Funktion aufgerufen wird, ist unbestimmt bei der Kompilierung, da der genaue Code ist abhängig von Vererbung genannt.

Während Parse::RecDescent::new("Parse::RecDescent", $grammar) syntaktisch korrekt ist, das ist eine ziemlich muffig Weg, um den Konstruktor aufrufen, und jetzt sind Sie zwingt ihn, in dieser Klasse definiert werden (und nicht in einem Vorfahren). Wenn Sie wirklich Ihre Argumente müssen bestätigen, tun Sie es in der Methode:

sub new
{
    my ($class, @args) = @_;
    die "Not enough arguments passed to constructor" if @args < 2;
    # ...
}

Siehe auch diese Frage früher an Prototypen und warum sie nicht in der Regel wie eine große Idee.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top