conteúdo

esferas de visibilidade, como salas em uma casa

Quando falamos sobre variáveis, mencionamos que o tipo mais comum de variáveis é a “variável local”, sem explicar mais por que elas são locais. Local para quê? Onde? Estamos finalmente prontos para explicar isso mais.uma vez que já falamos sobre métodos, também podemos discutir outro conceito importante: os âmbitos.

Wikipedia says: “In programming, the scope of a name is the part of a programwhere the name is valid: where the name can be used to reference to somethingelse.”(ligeiramente modificado para corresponder à nossa própria terminologia)

os nomes são conhecidos (ou definidos) num determinado âmbito, e desconhecidos (ou indefinidos)fora deste âmbito.

Você pode pensar em um escopo como de uma esfera, uma bolha, ou uma sala (com nowindows, e portas fechadas): certos nomes, como nomes variáveis, são “conhecidos” e”visíveis” dentro da sala. Outros nomes, conhecidos e visíveis noutra sala não são conhecidos nesta sala, mas apenas na outra sala.

cada vez que há uma chamada de método, e o fluxo de execução entra no corpo de themethod, ele entra em um novo escopo, ou “quarto”. As coisas que são ” locais “para o escopo deste método (isto é, as coisas que estão” dentro ” da sala), são apenas visíveis neste escopo. Fora disso, são desconhecidos.

variável ou Método local indefinido

esta é também uma boa oportunidade para falar sobre uma mensagem de erro que você pode ver mais frequentemente. Por exemplo, você vai vê-lo sempre que você fez um erro de Digitação escrever uma variável ou nome de método.

considere este código:

def add_two(number) number + 2endputs add_two(3)puts number

linha puts add_two(2) saída 5, mas a linha puts number willthen gerar um erro.

isto acontece porque à variável number é atribuído o número 3 quando o método é uma variável local. É local para o escopo do método. É criado quando o fluxo de execução entra no método.

fora deste escopo, quando o fluxo de execução voltou do método o escopo do método foi destruído, e todas as variáveis locais desapareceram. Thelocal variable number is therefore not known, and Ruby raises an error sayingundefined local variable or method 'number'.se pensar um pouco nesta mensagem de erro, faz algum sentido para si?

nós ignoramos silenciosamente o fato de que, em Ruby, ambos os nomes de variáveis locais e nomes de métodos, são escritos da mesma forma: eles são apenas palavras simples.Por exemplo, aqui:

number = 2puts number

number é uma variável local, e ele é usado na linha puts number.no entanto, aqui:

def number 2endputs number

number é o nome de um método. E ele pode ser usado (chamado) no exato sameway: puts number

Isso é porque Ruby, quando ele executa um programa, avalia uma instrução afteranother. E quando se depara com uma simples palavra, como number então ele vai firstcheck se, dentro do escopo atual, ele conhece uma variável local com o samename. Em caso afirmativo, utilizará o valor associado a esta variável. Se não houver nenhuma variável local com este nome, então ele vai procurar um método. Ifth there’s also no method with this name it will then raise the error messageundefined local variable or method 'number'.

assim a mensagem de erro é bastante precisa, mas também soa meio complicada. O que basicamente tenta dizer é:

você usou a palavra “número” aqui, e eu não sei (neste escopo). Queria usar uma variável local? Ou um método?isso faz sentido?de volta ao tema dos âmbitos locais. Vamos olhar para outro exemplo:

number = 1def add_to(number) number + 2endputs add_to(3)

qual você acha que será o resultado? Será 3, ou 5? Mais alguma coisa?

Se executar o código verá que é 5.

A razão para isso é que nós não atribuir o número 1 no exterior escopo para avariable number, mas esta variável é então nunca utilizado: a única outra linha no exterior escopo é a última linha puts add_to(3) e esta linha não usethe variável number.

em Vez disso, quando o fluxo de controle introduz o método add_to Ruby vai criar novo escopo local, e ele irá definir uma nova variável local number que isassigned o número de 3 que foi passado para o método. Esta nova variávelnumber é local para o escopo do método, e portanto esta é uma variável diferente da da primeira linha, no escopo externo.

encontramos a seguinte boa metáfora para os âmbitos:

Quando Ruby entra em um método, é como se ela entrasse em um novo quarto brilhante em ahouse. Com ela, ela traz os objetos que são passados como argumentos para o chamado de Deus. No exemplo acima ela traz um objeto que é o número 3.

Agora, assim que Ruby entra no método, ela coloca notas post-it sobre os objetos, de acordo com a lista de argumentos da definição do método. In ourexample that is the name number. Assim, a partir de agora, nesta sala, há aknown variável local que tem um valor atribuído: O objeto (número) 3 com o post-it number sobre ele.

no nosso exemplo, o escopo exterior e o escopo do método add_two, são duas salas diferentes, e há duas notas post-it diferentes presos em dois números diferentes, que por acaso têm o mesmo nome nelas.

Deixe uma resposta

O seu endereço de email não será publicado.