Variável local - Local variable
Em ciência da computação , uma variável local é uma variável que recebe um escopo local . As referências de variáveis locais na função ou bloco em que são declaradas substituem o mesmo nome de variável no escopo maior. Em linguagens de programação com apenas dois níveis de visibilidade, as variáveis locais são contrastadas com as variáveis globais . Por outro lado, muitas linguagens derivadas do ALGOL permitem qualquer número de níveis aninhados de visibilidade, com variáveis privadas, funções, constantes e tipos ocultos dentro deles, seja por blocos aninhados ou funções aninhadas . Variáveis locais são fundamentais para a programação procedural e, mais geralmente, para a programação modular : variáveis de escopo local são usadas para evitar problemas com efeitos colaterais que podem ocorrer com variáveis globais .
Alcance
Variáveis locais podem ter um escopo léxico ou dinâmico , embora o escopo léxico (estático) seja muito mais comum. No escopo léxico (ou escopo léxico; também chamado de escopo estático ou escopo estático), se o escopo de um nome de variável for um determinado bloco, então seu escopo é o texto do programa da definição do bloco: dentro do texto desse bloco, o nome da variável existe, e está vinculado ao valor da variável, mas fora do texto desse bloco, o nome da variável não existe. Em contraste, no escopo dinâmico (ou escopo dinâmico), se o escopo de um nome de variável é um determinado bloco, então seu escopo é aquele bloco e todas as funções transitivamente chamadas por aquele bloco (exceto quando sobrescrito novamente por outra declaração); após o término do bloco, o nome da variável não existe. Algumas linguagens, como Perl e Common Lisp , permitem que o programador escolha o escopo estático ou dinâmico ao definir ou redefinir uma variável. Exemplos de linguagens que usam escopo dinâmico incluem Logo , Emacs lisp e as linguagens de shell bash , dash e a declaração "local" do shell MirBSD Korn ( mksh ). A maioria das outras linguagens fornece variáveis locais com escopo léxico.
Na maioria dos idiomas, as variáveis locais são variáveis automáticas armazenadas diretamente na pilha de chamadas . Isso significa que, quando uma função recursiva chama a si mesma, as variáveis locais em cada instância da função recebem endereços distintos . Portanto, as variáveis desse escopo podem ser declaradas, gravadas e lidas, sem nenhum risco de efeitos colaterais nas funções fora do bloco em que foram declaradas.
As linguagens de programação que empregam a semântica de chamada por valor fornecem uma sub-rotina chamada com sua própria cópia local dos argumentos passados a ela. Na maioria dos idiomas, esses parâmetros locais são tratados da mesma forma que outras variáveis locais na sub-rotina. Em contraste, a semântica de chamada por referência e chamada por nome permite que os parâmetros atuem como apelidos dos valores passados como argumentos, permitindo que a sub-rotina modifique variáveis fora de seu próprio escopo.
Variáveis locais estáticas
Um tipo especial de variável local, chamado local estático, está disponível em muitas linguagens convencionais (incluindo C / C ++ , Visual Basic e VB.NET ) que permite que um valor seja retido de uma chamada da função para outra - é uma variável estática com escopo local. Nesse caso, as chamadas recursivas para a função também têm acesso à variável (única, estaticamente alocada ). Em todas as linguagens acima, as variáveis estáticas são declaradas como tal com uma palavra-chave de classe de armazenamento especial (por exemplo, static
).
Locais estáticos em funções globais têm o mesmo tempo de vida que as variáveis globais estáticas , porque seu valor permanece na memória durante a vida do programa, mas têm escopo de função (não escopo global), como acontece com as variáveis locais automáticas.
Isso é diferente de outros usos da static
palavra - chave , que tem vários significados diferentes em vários idiomas.
Variáveis locais em Perl
Perl suporta variáveis locais dinâmicas e com escopo léxico. A palavra local
- chave é usada para definir variáveis locais com escopo dinâmico, enquanto my
é usada para variáveis locais com escopo léxico. Como o escopo dinâmico é menos comum hoje, a documentação do Perl avisa que " local
não é o que a maioria das pessoas pensa como“ local ”.". Em vez disso, a local
palavra - chave fornece um valor temporário com escopo dinâmico para uma variável global (pacote), que dura até o final do bloco envolvente. No entanto, a variável é visível para qualquer função chamada de dentro do bloco. Para criar variáveis locais com escopo léxico, use o my
operador.
Para entender como funciona, considere o seguinte código:
$a = 1;
sub f() {
local $a;
$a = 2;
g();
}
sub g() {
print "$a\n";
}
g();
f();
g();
isso resultará em:
1 2 1
Isso acontece porque a variável global $ a é modificada para um novo significado temporário (local) interno f()
, mas o valor global é restaurado ao sair do escopo de f()
.
my
Nesse caso, usar em vez de local
teria impresso 1 três vezes, pois, nesse caso, a $a
variável seria limitada ao escopo estático da função f()
e não seria vista por g()
.
Randal L. Schwartz e Tom Phoenix argumentam que a operadora local
deveria ter um nome diferente como save
.
Variáveis locais em Ruby
Ruby como uma linguagem foi inspirada também em Perl, mas neste caso, a notação foi simplificada: um nome de variável global deve ser precedido por um sinal $, como $variable_name
, enquanto uma variável local simplesmente não tem o sinal $ antes de seu nome, like variable_name
(enquanto em perl todos os valores escalares têm um $ na frente). Observe que o Ruby só fornece suporte integrado para variáveis locais com escopo estático como o Perl my
, não variáveis locais com escopo dinâmico como o Perl local
. Existe pelo menos uma biblioteca para Ruby que fornece variáveis com escopo dinâmico.
Veja também
Referências
- ^ "Padrão C atual" (PDF) . (3,61 MB) (a partir de 2009). Em particular, consulte a seção 6.2.4 “Durações de armazenamento de objetos”, página 32.
- ^ perldoc.perl.org: local
-
^ perldoc.perl.org: perlsub: Valores temporários via
local()
-
^ perldoc.perl.org: perlsub: Variáveis privadas via
my()
- ^ Randal L. Schwartz e Tom Phoenix (01/07/2001). Aprendizagem Perl 3ª edição . O'REILLY. parágrafo 4.7. ISBN 0-596-00132-0 .
- ^ Conrad Irwin. "LSpace: escopo dinâmico para Ruby". Dezembro de 2012 http://cirw.in/blog/lspace Recuperado 2013-10-16.