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.