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

Posted in  | Tags  | no comments | no trackbacks

Creare un array dinamico con ruby

Posted by Dibi Store Mon, 24 Sep 2007 20:48:00 GMT

Oggi ho avuto un problema nel generare un array nel seguente formato:

[1, 'uno'],[2, 'due']

Il problema è banale e chiunque abbia un minimo di esperienza con gli array non avra problemi, io però non ci sono arrivato subito, e ho trovato aiuto nel canale #rub-lang nella rete azzurra-irc.
In pratica, supponendo che stiate lavorando in rails, ma anche in puro codice ruby è uguale, potete scrivere:

@array = Model.find(:all).collect { |s| "[#{s.id}, '#{s.name}']"}.join(',')

E il risultato è garantito! Prendeteci pure spunto per problemi simili nel generare array.

Posted in  | Tags ,  | no comments