É possível fazer conversões implícitas. A situação em que você se mete em problemas é quando você não sabe para que lado algo deve funcionar.
Um exemplo disso pode ser visto em Javascript, onde o +
operador trabalha de maneiras diferentes em momentos diferentes.
>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43
Se um dos argumentos for uma sequência, o +
operador é uma concatenação, caso contrário, é adição.
Se você recebe um argumento e não sabe se é uma sequência ou um número inteiro, e deseja fazer uma adição a ela, pode ser um pouco confuso.
Outra maneira de lidar com isso é a herança básica (que o perl segue - veja Programação é difícil, vamos usar scripts ... )
No Basic, a len
função faz sentido apenas ser chamada em uma String (documentos para visual basic : "Qualquer expressão String válida ou nome de variável. Se Expression for do tipo Object, a função Len retornará o tamanho conforme será gravado no arquivo por a função FilePut. ").
Perl segue esse conceito de contexto. A confusão que existe em JavaScript com a conversão implícita de tipos para o +
operador sendo, por vezes, adição e, por vezes, a concatenação não acontece em perl, porque +
é sempre além e .
é sempre concatenação.
Se algo é usado em um contexto escalar, é um escalar (por exemplo, usando uma lista como escalar, a lista se comporta como se fosse um número correspondente ao seu comprimento). Se você usar um operador de string ( eq
para teste de igualdade, cmp
para comparação de string), o escalar será usado como se fosse uma string. Da mesma forma, se algo foi usado em um contexto matemático ( ==
para teste de igualdade e <=>
para comparação numérica), o escalar é usado como se fosse um número.
A regra fundamental para toda a programação é "faça o que menos surpreende a pessoa". Isso não significa que não há surpresas, mas o esforço é surpreender a pessoa o mínimo.
Indo para um primo próximo do perl - php, há situações em que um operador pode atuar em algo em contextos de string ou numéricos e o comportamento pode surpreender as pessoas. O ++
operador é um exemplo. Nos números, ele se comporta exatamente como o esperado. Ao atuar em uma sequência, como "aa"
, ela a incrementa ( $foo = "aa"; $foo++; echo $foo;
imprime ab
). Também rolará para que, az
quando incrementado, se torne ba
. Isso não é particularmente surpreendente ainda.
$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
( ideona )
Isso imprime:
3d8
3d9
3e0
4
Bem-vindo aos perigos de conversões implícitas e operadores agindo de maneira diferente na mesma sequência. (O Perl lida com esse bloco de código de maneira um pouco diferente - ele decide que "3d8"
quando o ++
operador é aplicado é um valor numérico desde o início e passa 4
imediatamente ( ideone ) - esse comportamento é bem descrito no perlop: Incremento automático e decremento automático )
Agora, por que uma linguagem faz algo de uma maneira e outra faz de outra maneira chega aos pensamentos de design dos designers. A filosofia de Perl é que há mais de uma maneira de fazer isso - e posso pensar em várias maneiras de realizar algumas dessas operações. Por outro lado, o Python tem uma filosofia descrita no PEP 20 - O Zen do Python, que afirma (entre outras coisas): "Deveria haver uma - e de preferência apenas uma - maneira óbvia de fazê-lo".
Essas diferenças de design levaram a diferentes idiomas. Existe uma maneira de obter o comprimento de um número no Python. A conversão implícita vai contra essa filosofia.
Leitura relacionada: Por que Ruby não possui uma conversão implícita de Fixnum em String?
perl -e 'print length(100);'
imprime 3.