Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

<< Aula 5 - Variáveis e Comentários

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:

 
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":

 
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:

 
-- 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:

 
-- 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:

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

print(var)

Preste bastante atenção quanto à isto:

 
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:

 
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. bye1.gifExercício Descubra o que acontece em cada um dos casos e por quê:

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

Aula escrita por uma raposa levada Skyen Hasus, todos os créditos são dele.

Editado por MaXwEllDeN (veja o histórico de edições)

-"Supra Omnes Lux Lucis"

- Acima de todos brilha a Luz -

5VGnDyBz.png

  • 1 year later...
Postado

Cara parabéns pelo tutorial desculpa estar revivendo o tópico mas como o alerta sugere vou perguntar algo relevante e tem a ver com o tópico.

 

Seguindo o que nos ensinou, eu posso construir e destruir um andar com (do, end) no caso, então aqui.

 

var = 1
do
   local var = 2
   do
      var = 3
   end
   print(var)
end
do começou o primeiro andar foi setada a variável local igual a var = 2, então começa o segundo andar e foi setada a variável global var = 3 e finaliza o segundo andar e voltamos ao primeiro e var continua valendo 3 por que ? seguindo a lógica que nos passou não deveria ser 2 o valor de var ?

Isso quer dizer que as variáveis globais predominam uma variável local ?

Editado por Beyond Sky (veja o histórico de edições)


Medalhas:
1, 2

Qo5DnNn.png

stonedshowoff2_zpsf5409854.png

Postado
  • Autor

Cara parabéns pelo tutorial desculpa estar revivendo o tópico mas como o alerta sugere vou perguntar algo relevante e tem a ver com o tópico.

 

Seguindo o que nos ensinou, eu posso construir e destruir um andar com (do, end) no caso, então aqui.

 

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

 

vai sempre pegar a que estiver mais perto

 

Não, no caso ali, na linha 5, você mudou o valor da variável "var" mais próxima. Que no caso era a local var  = 2

-"Supra Omnes Lux Lucis"

- Acima de todos brilha a Luz -

5VGnDyBz.png

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Conteúdo Similar

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo