Variáveis ​​de instância em Ruby

As variáveis ​​de instância começam com um sinal de arroba (@) e podem ser referenciadas apenas nos métodos de classe. Eles diferem das variáveis ​​locais porque não existem dentro de nenhuma escopo. Em vez disso, uma tabela variável semelhante é armazenada para cada instância de uma classe. Variáveis ​​de instância vivem dentro de uma instância de classe, desde que essa instância permaneça ativa, as variáveis ​​de instância também.

Variáveis ​​de instância podem ser referenciadas em qualquer método dessa classe. Todos os métodos de uma classe usam a mesma instância tabela variável, em oposição às variáveis ​​locais em que cada método terá uma tabela de variáveis ​​diferente. É possível acessar variáveis ​​de instância sem primeiro defini-las. Isso não gerará uma exceção, mas o valor da variável será nada e um aviso será emitido se você executar o Ruby com o -W interruptor.

Este exemplo demonstra o uso de variáveis ​​de instância. Observe que o shebang contém o -W switch, que imprimirá avisos caso ocorram. Além disso, observe o uso incorreto fora de um método no escopo da classe. Isso está incorreto e discutido abaixo.

instagram viewer

Porque é o @teste variável incorreta? Isso tem a ver com o escopo e como o Ruby implementa as coisas. Dentro de um método, o escopo da variável de instância refere-se à instância específica dessa classe. No entanto, no escopo da classe (dentro da classe, mas fora de qualquer método), o escopo é o instância de classe escopo. Ruby implementa a hierarquia de classes instanciando Classe objetos, para que haja um segunda instância em jogo aqui. O primeiro instância é uma instância do Classe classe, e é aí que @teste Irá. A segunda instância é a instanciação de TestClasse é aqui que @valor Irá. Isso fica um pouco confuso, mas lembre-se de nunca usar @variáveis ​​de instância fora dos métodos. Se você precisar de armazenamento para toda a classe, use @@ class_variables, que pode ser usado em qualquer lugar do escopo da classe (dentro ou fora dos métodos) e se comportará da mesma maneira.

Você normalmente não pode acessar variáveis ​​de instância de fora de um objeto. Por exemplo, no exemplo acima, você não pode simplesmente chamar t.value ou t. @ value para acessar a variável de instância @valor. Isso violaria as regras de encapsulamento. Isso também se aplica a instâncias de classes filho; elas não podem acessar variáveis ​​de instância pertencentes à classe pai, mesmo que tecnicamente sejam do mesmo tipo. Portanto, para fornecer acesso a variáveis ​​de instância, assessor métodos devem ser declarados.

O exemplo a seguir demonstra como os métodos do acessador podem ser gravados. No entanto, observe que Rubi fornece um atalho e que este exemplo existe apenas para mostrar como os métodos do acessador funcionam. Geralmente, não é comum ver métodos do acessador escritos dessa maneira, a menos que algum tipo de lógica adicional seja necessária para o acessador.

Os atalhos tornam as coisas um pouco mais fáceis e compactas. Existem três desses métodos auxiliares. Eles devem ser executados no escopo da classe (dentro da classe, mas fora de qualquer método) e definirão dinamicamente métodos de maneira semelhante aos métodos definidos no exemplo acima. Não há mágica acontecendo aqui, e elas se parecem com palavras-chave de idioma, mas na verdade são apenas métodos de definição dinâmica. Além disso, esses acessadores geralmente ficam no topo da classe. Isso fornece ao leitor uma visão geral instantânea de quais variáveis ​​membros estarão disponíveis fora da classe ou para as classes filho.

Existem três desses métodos de acessador. Cada um deles pega uma lista de símbolos que descrevem as variáveis ​​de instância a serem acessadas.

  • attr_reader - Defina métodos de "leitor", como o nome método no exemplo acima.
  • attr_writer - Defina métodos de "gravador" como o age = método no exemplo acima.
  • attr_accessor - Defina os métodos "reader" e "writer".

Quando usar variáveis ​​de instância

Agora que você sabe o que são variáveis ​​de instância, quando você as usa? Variáveis ​​de instância devem ser usadas quando representam o estado do objeto. Nome e idade do aluno, suas notas, etc. Eles não devem ser usados ​​para armazenamento temporário, é para isso que servem as variáveis ​​locais. No entanto, eles poderiam ser usados ​​para armazenamento temporário entre chamadas de método para cálculos em vários estágios. No entanto, se você estiver fazendo isso, convém repensar a composição do método e transformar essas variáveis ​​em parâmetros do método.

instagram story viewer