A un certo punto ho letto un argomento ragionevolmente convincente su Perlmonks che testare il tipo di uno scalare con ref
o reftype
è una cattiva idea. Non ricordo chi ha lanciato l'idea o il link. Scusate.
Il punto era che in Perl ci sono molti meccanismi che consentono di fare un determinato atto scalare come quasi tutto quello che vuoi. Se si utilizza il filehandle tie
in modo che funzioni come un hash, il test con reftype
indicherà che si dispone di un file. Non ti dirà che devi usarlo come un hash.
Quindi, l'argomento è andato, è meglio usare la tipizzazione anatra per scoprire che cosa è una variabile.
Invece di:
sub foo {
my $var = shift;
my $type = reftype $var;
my $result;
if($type eq 'HASH') {
$result = $var->{foo};
}
elsif($type eq 'ARRAY') {
$result = $var->[3];
}
else {
$result = 'foo';
}
return $result;
}
Si dovrebbe fare qualcosa di simile:
sub foo {
my $var = shift;
my $type = reftype $var;
my $result;
eval {
$result = $var->{foo};
1; # guarantee a true result if code works.
}
or eval {
$result = $var->[3];
1;
}
or do {
$result = 'foo';
}
return $result;
}
Per la maggior parte io in realtà non faccio questo, ma in alcuni casi che ho. Sto ancora pensando a quando questo approccio è appropriato. Ho pensato di buttare fuori il concetto per ulteriori discussioni. Mi piacerebbe vedere i commenti.
Aggiornamento
mi sono reso conto che dovrei mettere avanti il mio pensiero su questo approccio.
Questo metodo ha il vantaggio di gestire qualsiasi cosa ti buttare a questo.
ha lo svantaggio di essere ingombrante, e un po 'strano. Inciampare su questo in qualche codice mi farebbe emettere un grosso "WTF".
Mi piace l'idea di testare se uno scalare agisce come un hash-ref, piuttosto che se si tratta di un ref hash.
Non mi piace questa implementazione.
Ho pensato che ref() ti direbbe solo che tipo di riferimento è e non restituirà nulla se non lo è. –
thx - beh, volevo solo dire thx - ma non è consentito – pm100
@Chris: Giusto, quindi se la variabile non è un riferimento, è possibile dedurre che si tratta di un semplice scalare dal fatto che non restituisce nulla. Altrimenti, saprai che tipo di riferimento è. –