Ruby Module::constants metaprogrammazione in Ruby
Posted by Dibi Store Mon, 03 Mar 2008 19:47:00 GMT
In ruby è possibile conoscere l'elenco delle costanti accessibili da un determinato modulo o classe attraverso il metodo Module::constants.
Il metodo ritorna un array delle costanti definite dal modulo e dai moduli che sono stati inclusi in essi. Di seguito degli esempi chiariranno meglio il concetto:
class Klass
Foo = 'foo'
end
puts Klass.constants.include?('Foo') # => true
module Foo
Bar = 'bar'
end
puts Foo.constants.include?('Bar') # => true
module Test
include Foo
end
puts Test.constants.include?('Bar') # => true
puts Object.constants.include?('Klass') # => true
puts Object.constants.include?('Foo') # => true
class Klass
Foo = 'foo'
end
puts Klass::Foo # => foo
Klass.const_set(:Test, 'valore')
puts Klass::Test # => valore
# Ridefiniamo la costante Foo
Klass.const_set(:Foo, 'bar')
puts Klass::Foo # => bar
Notate che l'ultimo test funziona, anche se giustamente viene restituito un warning che ci avvisa che la costante era già stata definita.
Per finire può essere utile ridefinire il metodo che viene invocato quando una costante non esiste, nell'esempio seguente restituirò un messaggio per avvertire che la costante non esiste:
def Object.const_missing(name)
"La costante #{name} che cercavi non è ancora stata definita"
end
puts Class::Foo # => La costante Foo che cercavi non è ancora stata definita

