La metaprogrammazione è la capacità di Ruby di definire metodi a runtime. È la magia dietro tante comodità di Rails.
class Configurazione
[:host, :port, :user].each do |campo|
define_method(campo) { instance_variable_get("@#{campo}") }
define_method("#{campo}=") { |v| instance_variable_set("@#{campo}", v) }
end
end
c = Configurazione.new
c.host = "localhost"
c.host # => "localhost"
Con define_method crei metodi in un ciclo invece di scriverli a mano uno per uno. Con method_missing intercetti chiamate a metodi che non esistono e reagisci al volo.
È potentissima, ma va dosata: codice generato dinamicamente è più difficile da leggere e da debuggare. Usala quando elimina ripetizione reale, non per fare colpo.