متاپروگرمینگ در روبی
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 | اجرای کد از رشته |
این مبحث بخشی از دوره آموزش کامل روبی است.