Metaprogramare în Ruby: define_method, send și Interceptarea cu method_missing în Ruby

Ghid complet pentru metaprogramare în Ruby: generarea dinamică a metodelor în timpul execuției cu define_method, apelul dinamic cu send și interceptarea apelurilor lipsă.

Sintaxă
define_method(:metoda) { ... } | obiect.send(:metoda) | def method_missing(...)

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!
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Metaprogramare în Ruby: define_method, send și Interceptarea cu method_missing

Ai o nelămurire despre utilizarea comenzii Metaprogramare în Ruby: define_method, send și Interceptarea cu method_missing sau 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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.