Las conversiones implícitas son bastante posibles de hacer. La situación en la que te metes en problemas es cuando no sabes cómo debería funcionar algo.
Un ejemplo de esto se puede ver en Javascript, donde el operador +
funciona de diferentes maneras en diferentes momentos.
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
Si uno de los argumentos es una cadena, entonces el operador +
es una concatenación de cadenas, de lo contrario es una adición.
Si te dan un argumento y no sabes si es una cadena o un entero, y quieres hacer una adición, puede ser un poco complicado.
Otra forma de lidiar con esto es desde el patrimonio Básico (ese perl sigue desde - vea La programación es difícil, vamos a hacer scripts ... )
En Básico, la función len
solo tiene sentido invocarse en una Cadena (docs para visual basic :" Cualquier expresión de String válida o nombre de variable. Si Expression es de tipo Object, la función Len devuelve el tamaño tal como se escribirá en el archivo con la función FilePut. ").
Perl sigue este concepto de contexto. La confusión que existe en JavaScript con la conversión implícita de tipos para el operador +
es a veces una adición y otras veces la concatenación no ocurre en perl porque +
es siempre además y .
es siempre concatenación.
Si se usa algo en un contexto escalar, es un escalar (por ejemplo, al usar una lista como escalar, la lista se comporta como si fuera un número correspondiente a su longitud). Si usa un operador de cadena ( eq
para la prueba de igualdad, cmp
para la comparación de cadena), el escalar se usa como si fuera una cadena. Del mismo modo, si se usó algo en un contexto matemático ( ==
para la prueba de igualdad y <=>
para la comparación numérica), el escalar se usa como si fuera un número.
La regla fundamental para toda la programación es "hacer lo que menos sorprenda a la persona". Esto no significa que no haya sorpresas allí, pero el esfuerzo es sorprender lo más mínimo a la persona.
Dirigiéndose a un primo cercano de perl - php, hay situaciones en las que un operador puede actuar sobre algo en contextos numéricos o de cadena y el comportamiento puede ser sorprendente para las personas. El operador ++
es uno de estos ejemplos. En los números, se comporta exactamente como se esperaba. Cuando actúa sobre una cadena, como "aa"
, incrementa la cadena ( $foo = "aa"; $foo++; echo $foo;
imprime ab
). También se reiniciará para que az
cuando se incremente se convierta en ba
. Esto no es particularmente sorprendente todavía.
$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
( ideone )
Esto se imprime:
3d8
3d9
3e0
4
Bienvenido a los peligros de las conversiones implícitas y los operadores que actúan de manera diferente en la misma cadena. (Perl maneja ese bloque de código de manera un poco diferente: decide que "3d8"
cuando se aplica el operador ++
es un valor numérico desde el inicio y va a 4
de inmediato ( ideone ) - este comportamiento está bien descrito en perlop : Incremento automático y decremento automático )
Ahora, ¿por qué un lenguaje hace algo de una manera y otro lo hace de otra manera para llegar a los pensamientos de diseño de los diseñadores? La filosofía de Perl es Hay más de una forma de hacerlo , y puedo pensar en varias formas de hacerlo. de estas operaciones. Por otro lado, Python tiene una filosofía descrita en PEP 20 - El zen de Python que declara (entre otras cosas): "Debería haber una, y preferiblemente solo una forma obvia de hacerlo".
Estas diferencias de diseño han conducido a diferentes idiomas. Hay una forma de obtener la longitud de un número en Python. La conversión implícita va en contra de esta filosofía.
Lectura relacionada: ¿Por qué Ruby no tiene la conversión implícita de Fixnum en String?