Aula 8: Acesso a Atributos

Ir em baixo

Aula 8: Acesso a Atributos

Mensagem por $ectumbot$ em Seg Maio 30, 2011 5:24 pm


Acesso a Atributos



» Prefácio:
Esta aula será bem rápida, tenho como objetivo "tapar" um buraco no conteúdo para quem esta acompanhando minhas aulas! Hoje iremos aprender sobre a acessibilidade das variáveis!

Ao olhar nos scripts do seu banco de scripts, nota-se que vários dos objetos iniciam com um @ ou um $, hoje veremos as diferenças.




» Variáveis Locais:
Toda variável local é aquela que não possuem nem $ nem @, elas são variáveis que só "existem" dentro do método em que são instanciadas.
Exemplo:

Código:
def soma
  a = b + c
  p a.to_s
end
Aqui a, b e c são variáveis locais, posso assim usar as mesmas varáriáveis (mesmos nomes) em vários métodos pois não vai fazer diferença! Veja que até agora nós usamos apenas variáveis locais!

» Variáveis de Instância - Atributos:
As variáveis de instância são aquelas que toda a classe pode utilizar, por exemplo, dentro de Scene_Menu, a janela @status_window é utilizada em vários métodos. Seria impossível executar métodos da @status_window em métodos dentro da scene caso não tivesse um @ no nome, vou exemplificar com valores numéricos:
Código:
def soma(m, n)
  @a = m
  @a += n
  p @a.to_s
end
#
def subtracao(m, n)
  @a = 0 if @a.nil?
  @a += m
  @a -= n
  p @a.to_s
end
O que vai ocorrer, no 1º método, o cálculo será sempre o mesmo (correto), mas no segundo método vai dar erro caso o 1º método já tenha sido executado, exemplo:
a = MinhaClasse.new #nome fictício para a classe em questão
a.soma(2,3)
>dentro do método
>> @a = m #m é 2 assim @a = 2
>> @a += n # n é 3, @a é 2, 3 + 2 = 5
>> Mostra na tela 5
a.subtração(6,2)
>dentro do método
>> pergunta @a é nil? # não intão passa para a próxima linha
>> @a += m # @a ja vale 5 pois o método soma foi executado antes, assim 5 + 6 = 11
>> @a -= n # 6 - 2 = 4

É óbvio que o exemplo que citei é um tanto pobre, mas você consegue ter uma idéia do que pode acontecer.


» Variáveis Globais:
São as variáveis(objetos) que podem ser acessadas em qualquer parte do programa, vou citar os classicos que nós já utilizamos:
$game_variables
$game_switches
...
Todos os objetos com um $ no início do nome são globais, isso significa que não importa a classe ou módulo que eu esteja, eu posso acessá-lo!


» Variáveis de Classe:
Variável de classe começam com @@, e existem apenas uma delas para cada classe. Como não se usam muitas variáveis de classe (@@), ninguém nunca vai ter problemas com isso. (Fonte KJr)



» Acessando atributos:
São 3 possíveis: attr_acessor, attr_reader e attr_writer
Por exemplo: eu tenho a classe Game_Actor e dentro dela tenho uma variável chamada @str (força) quero fazer com que essa variável possa ser acessada por outras classes uso, assim:
attr_acessor :str
Qual a diferença de usar um attr_acessor ou uma variável com $.
Ao usar o attr posso usar $game_actors[id].str (onde $game_actors[id] é o nome do objeto), assim a cada id, tenho um endereço na array diferente e assim um str diferente, mas se eu usasse $str, eu não poderia usar $game_actors[id], usaria apenas $str e ele seria igual para todos os personagens!!!


» Diferenças entre acessor reader e writer:
reader: permite apenas a leitura do atributo, posso por exemplo usar um print nesse atributo, mas não posso mudar o valor dele.
writer: permite alterar, mas não permite ler, não é muito utilizado
acessor: é o reader + o writer XD

Relembrando o uso:
Em geral usamos após o nome da classe:
class AlgumaCoisa
#Usamos attr_nome (um dos 3 possíveis) :nomedoatributo
attr_acessor :var1
attr_reader :var2
attr_writer :var3


» Dicas:
ocê pode usar os attr_ em uma linha só, para exemplificar isso e mostrar como os attr_ são úteis, vejam o exemplo

Esta é a classe Pessoa

Código:
class Pessoa
  def nome
    @nome
  end

  def nome=(valor)
    @nome = valor
  end

  def nascimento
    @nascimento
  end

  def nascimento=(valor)
    @nascimento = valor
  end

  def cpf
    @cpf
  end

  def cpf=(valor)
    @cpf = valor
  end
end
Usando attr, a mesma classe pessoa fica assim:
Código:
class Pessoa
  attr :nome, :nascimento, :cpf
end
Notem que é possível usar um attr para 3 instâncias, apenas separando com ,




todos os créditos e agradecimentos a Anderson Porto pelo lindo tutorial!
avatar
$ectumbot$
Membro
Membro

Engine : RPG Maker VX
Mensagens : 85
Localização : Em frente ao PC!

Ver perfil do usuário http://galaxiarpgmaker.123.st

Voltar ao Topo Ir em baixo

Voltar ao Topo

- Tópicos similares

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