Estamos aí de novo para retomar nossos estudos de ruby. Hoje falarei sobre Variáveis de Classe e Variáveis de Instância. Mas..
Antes de mais nada:

Poderia ter deixado para o final, mas vale lembrar que semana que vem acontecerá a RubyConf Brasil, que ocorrerá dia 3 e 4 de novembro em São Paulo. Nem é uma questão de puro merchanda, mas vale a pena mesmo comparecer em um evento tão importante como esse. Além de encontrar profissionais da área e palestras de qualidade (feitas também por profissionais da área), tem toda a questão de fortalecer e acompanhar o crescimento da linguagem no Brasil. Veja o cast http://rubyconf2011.akitaonrails.com/br/speakers.html e me diga se você não se assustou com tamanha qualidade. (Detalhe pra quem curte: Se liga na camisa do Nick Sutterer hehehe).
Pois é, muita coisa boa. As inscrições encerraram, mas vale a dica para o RubyConf do ano que vem. Provavelmente trarei um post aqui com a cobertura parcial do evento.
Link do evento: http://rubyconf2011.akitaonrails.com/
Rollback.
Bem, agora vamos voltar com o ruby e falar um pouco sobre Variáveis de Classe.
O que são Variáveis de Classe?
Elas são visíveis e compartilhadas para os métodos de classe e os métodos de instância de uma classe e até mesmo pela definição da própria classe, em suma, com ela é possível que todos os objetos a compartilhem. Se você lembrar da programação tradicional, ela funciona como se fosse uma variável global. Assim como as variáveis de instância, as variáveis de classe são encapsuladas; podem ser usadas na implementação de uma classe, porém não permitem acesso direto. Em ruby, elas possuem a sintaxe marcada pelo @@.
Uma maneira elegante de mostrar a sua utilização seria em um caso onde contabilizaríamos o número de objetos de uma classe que foram criados, por exemplo.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Test @@n = 0 def initialize @@n += 1 end def self.report puts "Number of objects created: #@@n" end end |
class Test
@@n = 0
def initialize
@@n += 1
end
def self.report
puts "Number of objects created: #@@n"
end
end
Com o método de classe report, conseguimos obter um retorno com o número de objetos já criados:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
ruby-1.9.2-p136 :018 > t = Test.new => # ruby-1.9.2-p136 :019 > Test.report Number of objects created: 1 => nil ruby-1.9.2-p136 :020 > Test.report Number of objects created: 1 => nil ruby-1.9.2-p136 :022 > t = Test.new => # ruby-1.9.2-p136 :023 > Test.report Number of objects created: 2 => nil |
ruby-1.9.2-p136 :018 > t = Test.new => # ruby-1.9.2-p136 :019 > Test.report Number of objects created: 1 => nil ruby-1.9.2-p136 :020 > Test.report Number of objects created: 1 => nil ruby-1.9.2-p136 :022 > t = Test.new => # ruby-1.9.2-p136 :023 > Test.report Number of objects created: 2 => nil
Variáveis de Instância de uma Classe
Classes são objetos e podem ter variáveis de instância assim como os objetos podem ter. As variáveis de instância de uma classe – as vezes chamadas apenas de variáveis de instância de classe - não são a mesma coisa que variáveis de instância. Mas elas são parecidas o suficiente epodem também ser usadas ao invés das variáveis de classe.
Uma variável de classe utilizada dentro de uma definição de classe e fora de um método de instância é uma variável de instância de uma classe. Assim como variáveis de classe, variáveis de instância de classe são associadas com a classe do que com qualquer instância específica da classe.
A desvantagem de usá-las é que elas não podem ser usadas dentro de métodos de instância como as variáveis de classe usam. Além dessa desvantagem, existe uma considerável possibilidade de confundir as variáveis de instância de classe com as variáveis de instância simples.
Para ficar bem claro: As variáveis de instância são criadas quando você instancia a Classe e as variáveis de instância de classe são injetadas em tempo de execução, partindo do princípio de que o objeto já foi instanciado.
Da mesma forma que as variáveis de instância, podemos utilizar attr, attr_reader e attr_accessor para criar métodos de acesso para elas. A única coisa que deve ser levada em consideração é que, para chamar esses métodos utilizados em metaprogramação no contexto certo.
1 2 3 |
class << self attr_accessor : n, : x, : y end |
class << self
attr_accessor : n, : x, : y
end
Com esses acessores definidos, podemos fazer referências aos dados utilizados em Ponto.x, Ponto.y, Ponto.n
Então rapazeada, ficamos nessa por aqui. Vou rumo a RubyConf que com certeza trará muito esclarecimento,
conhecimento e novas experiências.
Abraços!
Referências Externas:
http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/
http://sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby
http://www.oreillynet.com/ruby/blog/2007/01/nubygems_dont_use_class_variab_1.html
