Що таке метапрограмування (metaprogramming) у Ruby?

Метапрограмування в контексті програмування означає написання коду, який може маніпулювати іншим кодом під час виконання програми. У Ruby метапрограмування - це здатність змінювати чи генерувати код під час виконання програми.

Основні засоби метапрограмування в Ruby включають в себе те, що вказано нижче.

Визначення методів на льоту (Dynamic method definition). Це значить те, що ви можете визначати нові методи або модифікувати існуючі під час виконання програми.

class MyClass
  define_method :dynamic_method do
    puts "This method was defined dynamically!"
  end
end

obj = MyClass.new
obj.dynamic_method

Метакласи і singleton-класи. Ruby має концепцію метакласів, які дозволяють додавати методи тільки для конкретного об’єкта.

obj = Object.new

def obj.my_singleton_method
  puts "This is a singleton method for this specific object."
end

obj.my_singleton_method

Використання методів send і define_method. Ці методи дозволяють викликати методи динамічно і визначати нові методи в реальному часі.

class MyClass
  define_method :dynamic_method do |arg|
    puts "Dynamic method called with argument: #{arg}"
  end
end

obj = MyClass.new
obj.send(:dynamic_method, "Hello, world!")

Використання eval. Метод eval використовується для виконання рядка як коду Ruby. Важливо використовувати його з обережністю, оскільки він може потенційно викликати проблеми безпеки.

code = "puts 'Hello from eval!'"
eval(code)

Метапрограмування може бути потужним інструментом, але варто використовувати його обережно, оскільки неправильне використання може призвести до неочікуваної поведінки та важкостей у розумінні коду.