4. eval
• クラスと属性を指定し、値にチェックを掛ける例
4
class Person; end
add_checked_attribute(Person, :age)
def add_checked_attribute(klass, attr)
eval "
class #{klass}
def #{attr}()
@#{attr}
end
def #{attr}=(value)
raise 'Invalid attribute' unless value
@#{attr} = value
end
end
"
end
5. class_eval
• クラスと属性を指定し、値にチェックを掛ける例
5
class Person; end
add_checked_attribute(Person, :age)
def add_checked_attribute(klass, attr)
klass.class_eval do
define_method attr do
instance_variable_get(:@attr)
end
define_method "#{attr}=" do |value|
raise 'Invalid attribute' unless value
instance_variable_set(:@attr, value)
end
end
end
6. class_eval with block
• クラスと属性を指定し、値にチェックを掛ける例
6
class Person; end
add_checked_attribute(Person, :age)
def add_checked_attribute(klass, attr, &validation)
klass.class_eval do
define_method attr do
instance_variable_get(:@attr)
end
define_method "#{attr}=" do |value|
raise 'invalid attribute' unless validation.call(value)
instance_variable_set(:@attr, value)
end
end
end
7. Class Macro
• クラスと属性を指定し、値にチェックを掛ける例
7
class Class
def attr_checked(attr, &validation)
define_method attr do
instance_variable_get(:@attr)
end
define_method "#{attr}=" do |value|
raise 'invalid attribute' unless validation.call(value)
instance_variable_set(:@attr, value)
end
end
end
class Person
attr_checked :age do |v|
v >= 20
end
end
8. Module
• クラスと属性を指定し、値にチェックを掛ける例
8
module CheckedAttributes
def self.included(klass)
klass.extend ClassMethods
end
module ClassMethods
def attr_checked(attr, &validation)
define_method attr do
instance_variable_get(:@attr)
end
define_method "#{attr}=" do |value|
raise 'Invalid attribute' unless value
raise 'invalid attribute' unless validation.call(value)
instance_variable_set(:@attr, value)
end
end
end
end