[Aula 6] Escopo

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[Aula 6] Escopo

Mensagem  caiohu123 em Sex Nov 26, 2010 6:01 pm

Escopo
Aula 6

Vimos na aula anterior sobre variáveis, e vimos também, bem superficialmente, como declarar variáveis como locais.

Você pode se perguntar: "Qual a utilidade de uma variável local?", "O que ela tem de diferente de uma variável global?" ou "Se elas são tão importantes, por que quase ninguém usa?".

Vamos por passos. Imagine a seguinte situação: "Você tem uma variável chamada var, e ela vale 1, mas em certo ponto do script você quer que ela receba o valor 2, execute alguma coisa (Como um print) e, depois que executar, ela retorne ao valor anterior (1).". Um dos modos de fazer isto é usando uma outra variável temporária para armazenar o valor antigo, ficando assim:
Lua:
var = 1
temp_var = var
var = 2
print(var)
var = temp_var
temp_var = nil
print(var)


Veja que o código possui 7 linhas para fazer algo tão simples, por isso usar a variável temporária foi uma idéia de girico chamada carinhosamente de Gambiarra.

Vamos fazer a mesma coisa que antes, mas agora do modo "correto":
Lua:
var = 1
do
local var = 2
print(var)
end
print(var)


Observe que agora, mesmo tendo ficado com quase o mesmo número de linhas, está mais "charmoso". Vamos agora entender o do e o end.

O do é uma estrutura de controle (Abre/Fecha um Escopo) que abre um novo escopo.

O end é uma estrutura de controle (Abre/Fecha um Escopo) que fecha o escopo mais alto.

Você não deve ter entendido. Imagine que os escopos são como uma pirâmide, que começa inicialmente no andar 0 (Estes números são "imaginários", somente para facilitar o entendimento). As estruturas de controle tem o poder de construir ou destruir um degrau desta pirâmide, no caso o do constrói um andar e o end destrói o andar mais alto da pirâmide.

Vamos tentar entender:
Lua:
-- Estamos no andar 0.
do -- Construímos um andar. Agora estamos no andar 1.
end -- Destruímos o andar 1 e voltamos para o 0.
-- Estamos no andar 0.

Importante: Você deve terminar no andar que começou, ou seja, no andar 0.

Vamos ver o mesmo código um pouco maior:
Lua:
-- Estamos no andar 0.
do -- Construímos um andar. Agora estamos no andar 1.
do -- Construímos mais um andar. Agora estamos no andar 2.
do -- Construímos mais um andar. Agora estamos no andar 3.
end -- Destruímos o andar 3 e voltamos para o 2.
end -- Destruímos o andar 2 e voltamos para o 1.
end -- Destruímos o andar 1 e voltamos para o 0.
-- Estamos no andar 0.


A definição ideal para escopo (Em Lua) seria: Até onde as variáveis locais são alcançáveis. Isso porque se você estiver no andar 1 e tiver declarado uma variável no andar 2, quando o andar 2 tiver sido destuido pelo end, a variável será apagada e você não poderá mais chamá-la no andar 1, embora você possa chamar variáveis do andar 1 se estiver no andar 2. Se esta variável existir no andar 1 e no 2, vai sempre pegar a que estiver mais perto (No caso, a do andar 2). Se existir uma local alcançável e uma global, sempre pegará a local ao invés da global. A global só será pega se não houver nenhuma local alcançável.

Você pode declarar uma variável local em um andar e modificar seu valor em outro escopo. Esta é uma tática muito útil:
Lua:
var = 1
do
local var
do
var = 2
end
do
print(var)
end
end
print(var)


Preste bastante atenção quanto à isto:
Lua:
var = 1
do
do
local var = 2
end
do
print(var)
end
end

Se você está pensando que o valor escrito será 2, está muito enganado. A variável local "var" do primeiro andar 2 será apagada assim que o end destruir o andar, então o valor escrito será 1. Essa "pegadinha" pode frustrar vocês, então prestem atenção.
Vale lembrar que, como as funções são armazenadas em variáveis, elas também podem ser locais:
Lua:
teste = function() end -- Variável Global
function teste() end -- Variável Global

local teste = function() end -- Variável Local
local function teste() end -- Variável Local


OBS: Toda Estrutura de Controle deve terminar com o end.

São estruturas de controle:
do
function
while
repeat
if

OBS: O repeat é um caso especial e não usa end para finalizar o escopo. Ele usa o until.

Veremos as 4 últimas em aulas futuras.

Exercício
Descubra o que acontece em cada um dos casos e por quê:
Lua:
var = 1
local var = 2
print(var)

Lua:
var = 1
do
local var = 2
end
print(var)

Lua:
var = 1
local var
do
var = 2
end
print(var)

Lua:
var = 1
local var = 2
do
print(var)
end

Lua:
var = 1
do
local var = 2
do
var = 3
end
print(var)
end


credito: caiohu

caiohu123
Membro
Membro

Mensagens : 32
Data de inscrição : 25/11/2010

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum