Ruby este considerat standardul de aur în metaprogramare: capacitatea unui program de a inspecta, modifica și genera cod propriu în timpul rulării (Runtime Code Generation). Pe acest mecanism se bazează magia declarativă din Ruby on Rails (cum ar fi găsirea dinamică User.find_by_email).
Generarea automată a metodelor cu define_method
class RaportFinanciar
# Generăm automat metode pentru mai multe valute fără duplicare de cod:
[:ron, :eur, :usd, :gbp].each do |moneda|
define_method("afiseaza_total_#{moneda}") do |suma|
puts "Total raportat: #{suma} #{moneda.upcase}"
end
end
# Interceptarea metodelor dinamice inexistente prin method_missing:
def method_missing(nume_metoda, *argumente, &bloc)
if nume_metoda.to_s.start_with?("salveaza_in_")
destinatie = nume_metoda.to_s.sub("salveaza_in_", "")
puts "Salvare automată a raportului către depozitul '#{destinatie}'..."
else
super # dacă nu recunoaștem metoda, apelăm eroarea standard
end
end
def respond_to_missing?(nume_metoda, include_private = false)
nume_metoda.to_s.start_with?("salveaza_in_") || super
end
end
raport = RaportFinanciar.new
raport.afiseaza_total_eur(1500) # metodă generată de define_method!
raport.salveaza_in_cloud # metodă interceptată de method_missing!
Întrebări & Exemple de Cod:
Metaprogramare în Ruby: define_method, send și Interceptarea cu method_missingAi o nelămurire despre utilizarea comenzii
Metaprogramare în Ruby: define_method, send și Interceptarea cu method_missingsau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.