Le conversioni implicite sono del tutto possibili. La situazione in cui ti trovi nei guai è quando non sai da che parte dovrebbe funzionare qualcosa.
Un esempio di questo può essere visto in Javascript dove l'operatore +
funziona in modi diversi in momenti diversi.
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
Se uno degli argomenti è una stringa, l'operatore +
è una concatenazione di stringhe, altrimenti è un'aggiunta.
Se ti viene fornito un argomento e non sai se si tratta di una stringa o di un intero e vuoi aggiungerlo, può essere un po 'un disastro.
Un altro modo per affrontare questo è l'eredità di base (che segue perl da - vedi La programmazione è difficile, Let's Go Scripting ... )
In Basic, la funzione len
ha senso solo essere invocata su una stringa (documenti per visual basic :" Qualsiasi espressione String o nome di variabile valida. Se Expression è di tipo Object, la funzione Len restituisce la dimensione così come verrà scritta nel file dalla funzione FilePut. ").
Perl segue questo concetto di contesto. La confusione esistente in JavaScript con la conversione implicita dei tipi per l'operatore +
è talvolta aggiunta e talvolta la concatenazione non avviene in perl perché +
è sempre aggiunta e .
è sempre concatenazione.
Se qualcosa viene usato in un contesto scalare, è uno scalare (ad esempio usando una lista come scalare, la lista si comporta come se fosse un numero corrispondente alla sua lunghezza). Se si utilizza un operatore di stringa ( eq
per test di uguaglianza, cmp
per il confronto delle stringhe) lo scalare viene utilizzato come se fosse una stringa. Allo stesso modo, se qualcosa è stato utilizzato in un contesto matematico ( ==
per test di uguaglianza e <=>
per confronto numerico), lo scalare viene usato come se fosse un numero.
La regola fondamentale per tutta la programmazione è "fai la cosa che sorprende meno la persona". Questo non significa che non ci siano sorprese, ma lo sforzo è di sorprendere la persona meno.
Andando da un cugino stretto di perl-php, ci sono situazioni in cui un operatore può agire su qualcosa in contesti stringa o numerici e il comportamento può sorprendere le persone. L'operatore ++
è uno di questi esempi. Sui numeri, si comporta esattamente come previsto. Quando si agisce su una stringa, ad esempio "aa"
, si incrementa la stringa ( $foo = "aa"; $foo++; echo $foo;
stampe ab
). Rotolerà anche in modo che az
quando incrementato diventi ba
. Questo non è ancora particolarmente sorprendente.
$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
( ideone )
Stampa:
3d8
3d9
3e0
4
Benvenuto 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 viene applicato l'operatore ++
è un valore numerico dall'inizio e va immediatamente a 4
( ideone ) - questo comportamento è ben descritto in perlop : Incremento automatico e decremento automatico )
Ora, perché una lingua fa qualcosa in un modo o nell'altro, in un altro modo arriva ai pensieri progettuali dei designer. La filosofia di Perl è C'è più di un modo per farlo - e posso pensare a un certo numero di modi per farlo di queste operazioni. D'altra parte, Python ha una filosofia descritta in PEP 20 - The Zen of Python che afferma (tra le altre cose): "Ci dovrebbe essere uno - e preferibilmente solo un modo - ovvio per farlo."
Queste differenze di progettazione hanno portato a diverse lingue. 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 stringa?