You need to use eval
but want to limit the
number of times eval
is necessary.
Move the use of eval
from within the method
definition to defining the method itself.
class Person def self.attr_with_default(options) options.each_pair do |attribute, default_value| define_method attribute do eval "@#{attribute} ||= #{default_value}" end end end attr_with_default :emails => "[]", :employee_number =>"EmployeeNumberGenerator.next" end
class Person def self.attr_with_default(options) options.each_pair do |attribute, default_value| eval "define_method #{attribute} do @#{attribute} ||= #{default_value} end" end end attr_with_default :emails => "[]", :employee_number =>"EmployeeNumberGenerator.next" end