执行块错误

时间:2012-03-20 08:10:29

标签: ruby

我有下一个代码:

class Class
    def attr_checked(attribute, &validation)
        define_method "#{attribute}=" do |value|            
            raise 'Invalid attribute' unless validation.call(value)         
            instance_variable_set("@#{attribute}", value)
        end

        define_method attribute do
            instance_variable_get "@#{attribute}"
        end
    end
end

class Person
    attr_checked :age do |v|
        v >= 18
    end
end

bob = Person.new
bob.age = 10
p bob.age

以及我执行时的错误消息:

  

。\ example_19.rb ./example_19.rb:4:in block in attr_checked': Invalid attribute (RuntimeError) from ./example_19.rb:23:in'

为什么以及如何解决?

1 个答案:

答案 0 :(得分:1)

这实际上正是你的代码所要求的。

如果块的计算结果为true,则attr_checked方法仅返回true。您的块仅在年龄大于或等于18时返回true。

attr_checked :age do |v|
        v >= 18
end

当你设置age = 10时,这个块返回false并且根据这一行返回'Invalid Attribute'错误:

raise 'Invalid attribute' unless validation.call(value)