Las conversiones implícitas son bastante posibles de hacer. La situación en la que te metes en problemas es cuando no sabes de qué manera algo debería funcionar.
Un ejemplo de esto se puede ver en Javascript, donde el +
operador trabaja 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 suma.
Si se le da un argumento y no sabe si es una cadena o un número entero, y desea agregarlo, puede ser un poco complicado.
Otra forma de lidiar con esto es desde la herencia básica (de la cual se desprende Perl; ver Programación es difícil, vamos a crear secuencias de comandos ... )
En Basic, la len
función solo tiene sentido al ser invocada en una Cadena (documentos para visual basic : "Cualquier expresión de Cadena válida o nombre de variable. Si la Expresión es de tipo Objeto, la función Len devuelve el tamaño tal como será escrito en el archivo por 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 suma y otras concatenación no ocurre en perl porque siempre+
es suma y siempre es 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 prueba de igualdad, cmp
para comparación de cadena), el escalar se usa como si fuera una cadena. Del mismo modo, si algo se usó en un contexto matemático ( ==
para prueba de igualdad y <=>
para comparación numérica), el escalar se usa como si fuera un número.
La regla fundamental para toda programación es "hacer lo que menos sorprende a la persona". Esto no significa que no haya sorpresas allí, pero el esfuerzo es sorprender a la persona lo menos.
Yendo a un primo cercano de perl - php, hay situaciones en las que un operador puede actuar sobre algo en contextos de cadena o numéricos y el comportamiento puede ser sorprendente para las personas. El ++
operador es uno de esos ejemplos. En números, se comporta exactamente como se esperaba. Al actuar sobre una cadena, como "aa"
, incrementa la cadena ( $foo = "aa"; $foo++; echo $foo;
imprime ab
). También se volcará para que az
cuando se incremente se haga 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";
( ideona )
Esto 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 principio y va de 4
inmediato ( ideone ), este comportamiento se describe bien en perlop: incremento automático y decremento automático )
Ahora, por qué un idioma hace algo de una manera y otro lo hace de otra manera llega a los pensamientos de diseño de los diseñadores. La filosofía de Perl es que hay más de una forma de hacerlo , y puedo pensar en varias formas de realizar algunas de estas operaciones. Por otro lado, Python tiene una filosofía descrita en PEP 20 - El Zen de Python que establece (entre otras cosas): "Debe haber una, y preferiblemente solo una, forma obvia de hacerlo".
Estas diferencias de diseño han llevado 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 una conversión implícita de Fixnum en String?
perl -e 'print length(100);'
impresiones 3.