Constantes
Uma constante Ruby é como uma variável, exceto que seu valor supostamente deve se manter constante enquanto o programa durar. O interpretador Ruby na verdade não força a constância de constantes, mas ele avisa caso um programa altere o valor de uma constante, como mostrado nesse exemplo trivial – p054constwarn.rb
1 # p054constwarn.rb 2 A_CONST = 10 3 A_CONST = 20
Produz um aviso (warning):
1 p054constwarn.rb:3: warning: already initialized constant A_CONST 2 # aviso: a constante A_CONST já foi inicializada
Do ponto de vista léxico, o nome de constantes se parece com o de variáveis locais, exceto pelo fato de começarem uma letra em maiúsculo. Por convenção, a maioria das constantes são escritas com todas as letras em maiúsculas e underscores são usados para separar palavras, DESSA_FORMA. Os nomes de módulo e de classes Ruby são também constantes, mas são convencionalmente escritos usando letras maiúsculas no início de cada palavra (o chamado camel case), AssimPorExemplo.
Perceba que constantes não existem até que um valor seja associado as mesmas.
Embora constantes não devam ser alteradas, você pode modificar o estado interno dos objetos que elas referenciam, como visto no exemplo p055constalter.rb:
1 # p055constalter.rb 2 A_CONST = "Doshi" 3 B_CONST = A_CONST 4 A_CONST[0] = "J" # altera a string referenciada pela constante 5 puts A_CONST # mostra Joshi 6 puts B_CONST # também mostra Joshi
NO RAILS: Você pode encontrar exemplos desse tipo de operação (modificação) no código fonte do Rails, onde constantes aparecem prominentemente e os objetos que elas representam passam por mudanças com certa frequência.
Observe:
O programa p056const.rb mostra tudo isso:
1 CONSTANTE_EXTERNA = 99 2 3 class Constante 4 def pega_constante 5 CONSTANTE 6 end 7 CONSTANTE = CONSTANTE_EXTERNA + 1 8 end 9 10 puts Constante.new.pega_constante 11 puts Constante::CONSTANTE 12 puts ::CONSTANTE_EXTERNA 13 puts Constante::NOVA_CONSTANTE = 123
Outro exemplo elaborado sobre métodos de uma classe é o p057mymethods2.rb. Nesse exemplo nós também vemos como escrever um método de classe.
1 # p057mymethods2.rb 2 # variávais e métodos começam com letra minúscula 3 $glob = 5 # variáveis globais começam com $ 4 class TestVar # nome de classe é constante, começa com maiúscula 5 @@cla = 6 # variáveis de classe começam com @@ 6 CONST_VAL = 7 # estilo de constante, caixa alta, underscore 7 def initialize(x) # construtor 8 @inst = x # variáveis de instância começam com @ 9 @@cla += 1 # cada objeto compartilha @@cla 10 end 11 def self.cla # método de classe, getter 12 @@cla 13 end 14 def self.cla=(y) # método de classe, setter, também TestVar. 15 @@cla = y 16 end 17 def inst # método de instância, getter 18 @inst 19 end 20 def inst=(i) # método de instância, setter 21 @inst = i 22 end 23 end 24 puts $glob 25 test = TestVar.new(3) # chama construtor 26 puts TestVar.cla # chma getter 27 puts test.inspect # dá o ID do objeto e variáveis de instância 28 TestVar.cla = 4 # chama setter 29 test.inst=8 # chama setter 30 puts TestVar.cla 31 puts test.inst # chama getter 32 other = TestVar.new(17) 33 puts other.inspect 34 puts TestVar.cla
Listei todos os pontos importantes que você precisa se lembrar após ter completado os seguintes tópicos: Serialização de Objetos, Módulos/Mixins, Self e Constantes.
Este material tem como base o tutorial do RubyLearning.com de Satish Talim e foi traduzido por membros do GURU-SP com a permissão do autor.
Ajude o RubyLearning participando em algum dos cursos pagos ou fazendo uma doação para o projeto