Question

La méthode new de Parse::RecDescent a ce prototype:

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

et si je crée un objet comme celui-ci:

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

il va créer un analyseur, et la méthode recevra 2 paramètres « Parse :: RecDescent » et grammaire $, non? Si je tente de créer un objet comme:

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

échouera en disant « Pas assez arguments pour Parse :: RecDescent :: nouveau », et je comprends ce message. Je ne passe 2 paramètres. Cependant, je ne comprends pas pourquoi la version flèche fonctionne.

Pouvez-vous expliquer?

Était-ce utile?

La solution

prototypes de fonction ne sont pas vérifiées lorsque vous l'appelez comme une méthode de style OO. En outre, vous contournez un prototype de vérification lorsque vous appelez un sous avec et, comme dans &sub(arg0, arg1..);

De perldoc perlsub :

  

Non seulement le « et » forme font la liste des arguments en option, il désactive également tout prototype de vérification sur des arguments que vous fournissez. Ceci est en partie   des raisons historiques, et en partie pour avoir un moyen pratique de tricher si vous savez ce que vous faites. Voir Prototypes ci-dessous.

     

Les appels de méthode ne sont pas influencés par les prototypes, parce que la fonction à appeler est indéterminée au moment de la compilation, puisque le code exact appelé dépend de l'héritage.

Alors que Parse::RecDescent::new("Parse::RecDescent", $grammar) est syntaxiquement correct, c'est une façon assez puante d'appeler le constructeur, et maintenant vous obligeaient à définir dans cette classe (plutôt que dans un ancêtre). Si vous avez vraiment besoin de valider vos arguments, faites-le dans la méthode:

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

Voir aussi cette question plus tôt sur des prototypes et pourquoi ils ne sont pas généralement une bonne idée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top