Perché non sono entrambe le versioni di questo codice non riuscendo controllare la -c Perl?

StackOverflow https://stackoverflow.com/questions/2255495

  •  20-09-2019
  •  | 
  •  

Domanda

Il metodo new di Parse::RecDescent ha questo prototipo:

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

e se creo un oggetto come questo:

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

si creerà un parser, e il metodo riceverà 2 parametri "Parse :: RecDescent" e $ grammatica, giusto? Se cerco di creare un oggetto come:

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

questo fallirà dicendo "non abbastanza argomenti per Parse :: :: RecDescent nuova", e capisco questo messaggio. Sto solo passando 2 parametri. Tuttavia, non capisco il motivo per cui la versione freccia funziona.

Può spiegare?

È stato utile?

Soluzione

prototipi di funzione non vengono controllati quando si chiama come un metodo di OO-style. Inoltre, si ignora prototipo verifica quando si chiama un sub con &, come in &sub(arg0, arg1..);

perldoc perlsub :

  

Non solo la "&" forma fanno la lista degli argomenti opzionale, disabilita anche qualsiasi prototipo controllo su argomenti non forniti. Questo è in parte per   ragioni storiche, e in parte per avere un modo conveniente per ingannare se si sa cosa si sta facendo. Vedere Prototipi di seguito.

     

chiamate metodo non sono influenzati da prototipi o, perché la funzione da chiamare è indeterminato al momento della compilazione, dal momento che il codice esatto chiamata dipende eredità.

Mentre Parse::RecDescent::new("Parse::RecDescent", $grammar) è sintatticamente corretto, questo è un modo piuttosto puzzolente di chiamare il costruttore, e ora si stanno costringendo ad essere definito in quella classe (piuttosto che in un antenato). Se si ha realmente bisogno per convalidare le tue argomentazioni, farlo all'interno del metodo:

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

Si veda anche questa domanda in precedenza su prototipi e perché non sono di solito una così grande idea.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top