Irgendwann las ich ein einigermaßen überzeugendes Argument auf Perlmonks, dass das Testen des Typs eines Skalars mit ref
oder reftype
eine schlechte Idee ist. Ich weiß nicht mehr, wer die Idee vorangebracht hat oder die Verbindung. Es tut uns leid.
Der Punkt war, dass es in Perl viele Mechanismen gibt, die es möglich machen, dass ein gegebener Skalar sich so verhält, als würde er alles tun, was man will. Wenn Sie tie
ein Dateihandle, so dass es sich wie ein Hash verhält, wird der Test mit reftype
Ihnen sagen, dass Sie eine Datei haben. Es wird Ihnen nicht sagen, dass Sie es wie ein Hash verwenden müssen.
Also ging das Argument, es ist besser, Ente Typisierung zu verwenden, um herauszufinden, was eine Variable ist.
Statt:
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;
}
Sie sollten etwas tun:
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;
}
Für den größten Teil dieser ich eigentlich gar nicht tun, aber in einigen Fällen die ich habe. Ich bin immer noch dabei, zu überlegen, wann dieser Ansatz angemessen ist. Ich dachte, ich würde das Konzept zur weiteren Diskussion rauswerfen. Ich würde gerne Kommentare sehen.
aktualisieren
ich, dass ich auf diesem Ansatz meine Gedanken vorbringen realisiert sollte.
Diese Methode hat den Vorteil, alles zu handhaben, was Sie darauf werfen.
Es hat den Nachteil, umständlich und etwas seltsam. Wenn ich in einem Code darüber stolpere, würde ich einen großen fetten WTF machen.
Ich mag die Idee zu testen, ob ein Skalar wirkt wie ein Hash-Ref, eher, ob es ein Hash-Ref ist.
Ich mag diese Implementierung nicht.
Ich dachte ref() würde Ihnen nur sagen, welche Art von Referenz es ist und nichts zurückgeben, wenn es nicht eins ist. –
thx - nun, ich wollte nur thx sagen - aber es ist nicht erlaubt – pm100
@Chris: Richtig, also, wenn die Variable keine Referenz ist, können Sie daraus schließen, dass es ein einfacher Skalar aus der Tatsache ist, dass es nichts zurückgibt. Andernfalls werden Sie wissen, um was für eine Referenz es sich handelt. –