Le conversioni implicite sono del tutto possibili. La situazione in cui ti trovi nei guai è quando non sai in che modo qualcosa dovrebbe funzionare.
Un esempio di questo può essere visto in Javascript in cui l' +
operatore lavora in modi diversi in momenti diversi.
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
Se uno degli argomenti è una stringa, allora il +
operatore è una concatenazione di stringhe, altrimenti è un'aggiunta.
Se ti viene dato un argomento e non sai se si tratta di una stringa o di un numero intero e desideri aggiungerlo, può essere un po 'un casino.
Un altro modo per affrontare questo è dall'eredità di base (che segue il perl - vedi Programmazione è difficile, Let's Go Scripting ... )
In Basic, la len
funzione ha senso solo essere invocata su una stringa (documenti per Visual Basic : "Qualsiasi espressione String valida o nome variabile. Se Expression è di tipo Object, la funzione Len restituisce la dimensione in quanto verrà scritta nel file da la funzione FilePut. ").
Perl segue questo concetto di contesto. La confusione che esiste in JavaScript con la conversione implicita di tipi per l' +
operatore a volte addizione e talvolta concatenazione non si verifica in perl perché +
è sempre addizione ed .
è sempre concatenazione.
Se qualcosa viene usato in un contesto scalare, è uno scalare (ad es. Usando un elenco come scalare, l'elenco si comporta come se fosse un numero corrispondente alla sua lunghezza). Se si utilizza un operatore stringa ( eq
per test di uguaglianza, cmp
per confronto di stringhe) lo scalare viene utilizzato come se fosse una stringa. Allo stesso modo, se qualcosa è stato usato in un contesto matematico ( ==
per test di uguaglianza e<=>
per confronto numerico), lo scalare è usato come se fosse un numero.
La regola fondamentale per tutta la programmazione è "fai la cosa che sorprende di meno la persona". Questo non significa che non ci siano sorprese lì dentro, ma lo sforzo è quello di sorprendere la persona il meno.
Andando a stretto contatto con perl - php, ci sono situazioni in cui un operatore può agire su qualcosa in contesti di stringa o numerici e il comportamento può essere sorprendente per le persone. L' ++
operatore ne è un esempio. Sui numeri, si comporta esattamente come previsto. Quando agisce su una stringa, ad esempio "aa"
, aumenta la stringa ( $foo = "aa"; $foo++; echo $foo;
stampa ab
). Passerà anche in modo che az
quando incrementato diventa ba
. Questo non è ancora particolarmente sorprendente.
$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
( ideone )
Questo stampa:
3d8
3d9
3e0
4
Benvenuti nei pericoli delle conversioni implicite e degli operatori che agiscono in modo diverso sulla stessa stringa. (Perl gestisce quel blocco di codice in modo leggermente diverso - decide che "3d8"
quando l' ++
operatore viene applicato è un valore numerico dall'inizio e va 4
subito ( ideone ) - questo comportamento è ben descritto in perlop: Auto-increment e Auto-decrement )
Ora, perché una lingua fa qualcosa in un modo e un altro in un altro modo arriva ai pensieri progettuali dei designer. La filosofia di Perl è che c'è più di un modo per farlo - e posso pensare a una serie di modi per eseguire alcune di queste operazioni. D'altra parte, Python ha una filosofia descritta in PEP 20 - The Zen of Python che afferma (tra le altre cose): "Dovrebbe esserci uno - e preferibilmente solo un - modo obsoleto di farlo."
Queste differenze di progettazione hanno portato a lingue diverse. C'è un modo per ottenere la lunghezza di un numero in Python. La conversione implicita va contro questa filosofia.
Lettura correlata: Perché Ruby non ha una conversione implicita di Fixnum in String?
perl -e 'print length(100);'
stampe 3.