Implizite Konvertierungen sind durchaus möglich. Die Situation, in der Sie in Schwierigkeiten geraten, ist, wenn Sie nicht wissen, wie etwas funktionieren soll.
Ein Beispiel hierfür ist Javascript, bei dem der +
Bediener zu verschiedenen Zeiten auf unterschiedliche Weise arbeitet.
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
Wenn eines der Argumente eine Zeichenfolge ist, ist der +
Operator eine Zeichenfolgenverkettung, andernfalls handelt es sich um eine Addition.
Wenn Sie ein Argument erhalten und nicht wissen, ob es sich um eine Zeichenfolge oder eine Ganzzahl handelt, und dies ergänzen möchten, kann dies zu einem Durcheinander führen.
Ein anderer Weg, um damit umzugehen, ist das Basic-Erbe (das Perl folgt aus - siehe Programmierung ist schwierig, Let's Go Scripting ... ).
In Basic len
macht die Funktion nur Sinn, wenn sie für einen String aufgerufen wird (docs for visual basic : "Jeder gültige String-Ausdruck oder Variablenname. Wenn der Ausdruck vom Typ Object ist, gibt die Len-Funktion die Größe zurück, von der aus er in die Datei geschrieben wird die FilePut-Funktion. ").
Perl folgt diesem Kontextkonzept. Die Verwirrung , die mit impliziter Umwandlung von Typen für den in JavaScript vorhanden +
Operator ist manchmal zusätzlich und manchmal in Perl - Verkettung geschieht nicht , weil +
ist immer zusätzlich und .
ist immer Verkettung.
Wenn etwas in einem skalaren Kontext verwendet wird, ist es ein Skalar (z. B. bei Verwendung einer Liste als Skalar verhält sich die Liste so, als wäre es eine Zahl, die ihrer Länge entspricht). Wenn Sie einen String-Operator verwenden ( eq
für den Gleichheitstest, cmp
für den String-Vergleich), wird der Skalar so verwendet, als wäre er ein String. Wenn etwas in einem mathematischen Kontext verwendet wurde ( ==
für die Gleichheitsprüfung und <=>
für den numerischen Vergleich), wird der Skalar genauso verwendet, als ob es eine Zahl wäre.
Die Grundregel für jede Programmierung lautet: "Tu das, was die Person am wenigsten überrascht". Das heißt nicht, dass es dort keine Überraschungen gibt, aber die Anstrengung besteht darin, die Person am wenigsten zu überraschen.
Es gibt Situationen, in denen ein Operator in einem String oder in einem numerischen Kontext auf etwas einwirken kann und das Verhalten für Menschen überraschend sein kann. Der ++
Operator ist ein solches Beispiel. Bei Zahlen verhält es sich genau wie erwartet. Wenn Sie auf eine Zeichenfolge einwirken, z. B. "aa"
, wird die Zeichenfolge inkrementiert ( $foo = "aa"; $foo++; echo $foo;
gedruckt ab
). Es wird auch überrollen, so dass, az
wenn inkrementiert wird ba
. Das ist noch nicht besonders überraschend.
$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
( ideone )
Dies druckt aus:
3d8
3d9
3e0
4
Willkommen zu den Gefahren impliziter Konvertierungen und zu Operatoren, die auf derselben Zeichenfolge unterschiedlich handeln. (Perl behandelt diesen Codeblock ein bisschen anders - es entscheidet, dass "3d8"
der ++
Operator von Anfang an ein numerischer Wert ist und geht 4
sofort zu ( ideone ) - dieses Verhalten ist in perlop gut beschrieben : Auto-Inkrement und Auto-Dekrement. )
Warum eine Sprache etwas auf die eine und eine andere Weise tut, führt zu den Designgedanken der Designer. Perls Philosophie ist, dass es mehr als einen Weg gibt, dies zu tun - und ich kann mir eine Reihe von Wegen vorstellen, um einige dieser Operationen durchzuführen. Auf der anderen Seite hat Python eine in PEP 20 - The Zen of Python - beschriebene Philosophie, die (unter anderem) lautet: "Es sollte einen - und vorzugsweise nur einen - offensichtlichen Weg geben, dies zu tun."
Diese Designunterschiede haben zu unterschiedlichen Sprachen geführt. Es gibt eine Möglichkeit, die Länge einer Zahl in Python zu ermitteln. Implizite Konvertierung widerspricht dieser Philosophie.
Verwandte Lektüre: Warum hat Ruby keine implizite Konvertierung von Fixnum in String?
perl -e 'print length(100);'
druckt 3.