متاپروگرمینگ در روبی

define_method، send، eval و متاپروگرمینگ در روبی

متاپروگرمینگ چیست؟

متاپروگرمینگ یعنی کدی که کد دیگر را می‌نویسد یا تغییر می‌دهد. روبی یکی از قدرتمندترین زبان‌ها در این زمینه است.

send — فراخوانی متد با نام

class Person
  attr_accessor :name
end

p = Person.new
p.send("name=", "علی")  # فراخوانی setter
puts p.send("name")      # فراخوانی getter => علی

define_method — تعریف متد پویا

class Calculator
  [:add, :subtract, :multiply].each do |op|
    define_method(op) do |a, b|
      case op
      when :add then a + b
      when :subtract then a - b
      when :multiply then a * b
      end
    end
  end
end

calc = Calculator.new
puts calc.add(5, 3)         # => 8
puts calc.multiply(4, 6)   # => 24

method_missing

class DynamicDB
  def method_missing(name, *args)
    if name.to_s.start_with?("find_by_")
      field = name.to_s.sub("find_by_", "")
      "جستجو بر اساس #{field}: #{args.first}"
    else
      super
    end
  end

  def respond_to_missing?(name, include_private = false)
    name.to_s.start_with?("find_by_") || super
  end
end

db = DynamicDB.new
puts db.find_by_name("علی")    # => جستجو بر اساس name: علی
puts db.find_by_email("a@b.c") # => جستجو بر اساس email: a@b.c

خلاصه

متدتوضیح
sendفراخوانی متد با نام
define_methodتعریف متد پویا
method_missingمدیریت متد ناموجود
evalاجرای کد از رشته

این مبحث بخشی از دوره آموزش کامل روبی است.

ابزارهای مرتبط