RSS Feed

Classes e Módulos – Variáveis de Classe e Variáveis de Instância de Classe.

31/10/2011 by urieljuliatti

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


No Comments »

No comments yet.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code lang=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" extra="">