Una costante in
Ruby si riferisce ad un oggetto e viene creata con l'operazione di assegnamento. Nell'implementazione corrente di
Ruby, il riassegnamento di una costante genera un messaggio di warning (allarme); ecco un esempio (
p054constwarn.rb):
<span style="font-size:1.0em">
# p054constwarn.rb
A_CONST = 10
A_CONST = 20</span>
L'output generato è:
p054constwarn.rb:3: warning: already initialized constant A_CONST. Sebbene le costanti non possono essere cambiate, è possibile
modificare lo stato interno degli oggetti a cui si riferiscono, come si può notare in
p055constalter.rb:
<span style="font-size:1.0em"># p055constalter.rb
A_CONST = "Doshi"
B_CONST = A_CONST
A_CONST[0] = "J" # altera la stringa referenziata dalla costante
puts A_CONST # mostra Joshi
puts B_CONST # mostra anche Joshi</span>
Si possono trovare esempi di questo tipo di operazione di modifica nel codice sorgente
Rails, dove le costanti sono notevolmente utilizzate e gli oggetti che esse rappresentano sono soggetti a frequenti cambiamenti.
Da notare:
- costanti definite all'interno di una classe o modulo possono essere utilizzate ovunque all'interno della classe o del modulo;
- fuori della classe o del modulo, ad esse si può accedere usando l'operatore scope (:
, preceduto da un'espressione che ritorna la classe o il modulo appropriato; - in alternativa si può utilizzare solo l'operatore scope;
- le costanti non possono essere definite nei metodi;
- le costanti possono essere aggiunte a classi e moduli esistenti dall'esterno usando il nome della classe o del modulo e l'operatore scope prima del nome della costante.
Il programma
p056const.rb mostra quanto detto:
<span style="font-size:1.0em"># p056const.rb
OUTER_CONST = 99
class Const
def get_const
CONST
end
CONST = OUTER_CONST + 1
end
puts Const.new.get_const
puts Const::CONST
puts ::OUTER_CONST
puts Const::NEW_CONST = 123</span>
Ecco un altro esempio di utilizzo di costanti all'interno di un proprio metodo in una classe è
p057mymethods2.rb:
<span style="font-size:1.0em"># variabili e metodi iniziano con un carattere minuscolo
$glob = 5 # variabili globali iniziano con $
class TestVar # il nome costante di una classe inizia per lettere maiuscole
@@cla = 6 # le variabili di classe iniziano con @@
CONST_VAL = 7 # lo stile delle costanti tutto in maiuscolo
def initialize(x)
@inst = x # le variabili di istanza iniziano con @
@@cla += 1 # ogni oggetto condivide @@cla
end
def self.cla # metodo di classe, getter
@@cla
end
def self.cla=(y) # metodo di classe, setter, anche TestVar.
@@cla = y
end
def inst # metodo di istanza, getter
@inst
end
def inst=(i) # metodo di istanza, setter
@inst = i
end
end
puts $glob
test = TestVar.new(3)
puts TestVar.cla # chiama getter
puts test.inspect # pone l'ID dell'oggetto e le variabile di istanza
TestVar.cla = 4 # chiama setter
test.inst=8 # chiama setter
puts TestVar.cla
puts test.inst # chiama getter
other = TestVar.new(17)
puts other.inspect
puts TestVar.cla</span>
"Traduzione e adattamento a cura di Francesca Beatrice Cice. La versione originale del tutorial di
Satish Talim può essere trovata su
rubylearning.com"