Duas das linguagens de script de tipo dinâmico mais populares, Python e Ruby, não fazem distinção na sintaxe entre a declaração de uma variável e a atribuição de um valor a ela.
Em ambos os idiomas, declarar uma variável n
e atribuir um valor a ela seria assim:
n = 10
E atribuir um novo valor à variável posteriormente pareceria o mesmo.
Isso cria dois grandes problemas:
Um erro de digitação no nome de uma variável ao alterar seu valor criaria uma nova variável e causaria bugs.
Isso torna as intenções do código menos claras. Difícil saber onde uma variável é declarada e usada pela primeira vez pode tornar o código mais confuso.
O que não entendo é por que esses idiomas não têm uma var
palavra-chave para usar na declaração, para fazer uma distinção entre uma declaração e uma atribuição. Isso não torna o idioma menos dinamicamente digitado e não vejo desvantagens.
Qual é a vantagem de não ter que definir explicitamente uma variável?
s/variable/name/g
.Respostas:
Como usuário, e não designer, do Python, há três razões pelas quais estou feliz com essas decisões:
Principalmente, ele lê melhor. É claro que tenho que decidir conscientemente introduzir uma nova variável ao escrever , mas o código é lido com muito mais frequência do que está escrito. Muito código é simples no sentido de que o controle do fluxo e do aninhamento não tem influência no significado e na existência de variáveis. Quando eu li
então geralmente não me importo com qual (se houver) menção de um nome o introduz pela primeira vez, apenas me importo que ele esteja lá e o que acontece com ele.
Observe que um corpo significativo de pseudo-código usa a mesma convenção (sem declaração, introdução implícita por atribuição), e o Python é frequentemente descrito como pseudo-código executável, apenas de brincadeira. Quatro personagens extras para cada variável local que, aos meus olhos mimadas, sentir como desordem significativa no contexto do Python, especialmente quando não se sentir como ele adiciona qualquer valor (ver abaixo); isso seria diminuído por um
:=
operador como em Go.Segundo, ainda não encontrei um erro de digitação (devido a esse recurso específico) que também não se mostrou de outra maneira clara. Talvez eu mude de idéia daqui a alguns anos, quando encontrar alguns erros desse tipo, mas até agora está bem na minha lista de coisas que causam erros. Há um número razoável de perguntas
UnboundLocalError
e é um pouco complicado de explicar para iniciantes, mas a frequência e a popularidade dessas perguntas, em comparação com outras dicas (parâmetros padrão mutáveis, semântica de referência, classe versus variáveis de instância) indicam que é um problema raro.Finalmente, a intenção ... desculpe, mas eu realmente não consigo entender essa. Ao ler e escrever Python, é sempre perfeitamente claro: o que você atribui se destina como local, a menos que seja declarado em voz alta e explicitamente o contrário. Nenhuma pergunta sobre isso. Além disso, como (pelo menos em Python) uma variável é local para toda a função ou não existe , você não pode ter um código complicado que use uma variável local em um ramo e uma global em outro. Você vê um nome sendo atribuído? Você sabe instantaneamente que sempre foi local desde o início. Bem, a menos que o código seja quebrado de uma maneira muito especial (e jogará o temido
UnboundLocalError
em tempo de execução, ao entrar nesses casos).fonte
$a = [1, 2, 3]; foreach ($a as $k => &$v) $v++; foreach ($a as $k => $v) echo "$k => $v\n";
Não é que definir uma variável seja o mesmo que atribuí-la - é que as variáveis não são definidas. Chama-se Digitação dinâmica .
Você não pode ter uma linguagem de tipo dinâmico que permita definir uma variável, porque é isso que é a digitação dinâmica .
A decisão de fazer isso muda completamente a natureza do analisador e resulta em um tipo de idioma completamente diferente. A principal diferença para o usuário final é geralmente que, ao definir uma função, seus parâmetros acabam sendo de qualquer tipo ("digitação de pato"), o que é uma bênção, pois torna seu código muito mais simples e uma maldição, pois permite uma infinidade de novas maneiras pelas quais seu código pode falhar.
Não sou especialista em compiladores, mas acho que também é verdade que a digitação dinâmica tem implicações importantes para o sabor do OOP que você obtém em um idioma.
fonte