《ruby 元编程》中有这样一个例子: 写一个类似类宏 attr_accessor 的用来检验参数是否合法的方法。 但是使用中似乎有一中情况会被绕过:
模块代码:
module CheckAttr
def self.included base
base.extend ClassModule
end
module ClassModule
def attr_checked attr, &validate_block
define_method "#{attr}=" do |value|
raise 'invalidate attribuate' unless validate_block.call value
instance_variable_set "@#{attr}",value
end
define_method attr do
instance_variable_get "@#{attr}"
end
end
end
end
使用代码:
class Person
include CheckAttr
attr_checked :age do |v|
v >= 18
end
def initialize name,age
@name = name
@age = age
end
end
这种情况下如果直接使用person = Person.new 'shiyj',16
就会绕过这种检验,而只有使用person.age = 16
才会执行。
那么有没有一种更好的实现,使这个·attr_checked·能够像·attr_accessor·一样既定义@age
,又可以在@age=
时来控制??