我有一个包含一些私有属性的类。我想做的是为这些动态添加一些设置器,仅用于执行特定块。
我希望能够做到的示例:
class Content
attr_reader :a, :b
def initialize
@a = 1
@b = "plop"
end
def set(&block)
extend(Setter)
instance_eval(&block)
unextend(Setter) ????
end
module Setter
def a(value)
@a = value
end
def b(value)
@b = value
end
end
end
content = Content.new
content.set do
a 2
b "yeah!"
end
content.a # should return 2
编辑:感谢迄今为止的精彩回答。我澄清了这个问题,因为我实际上需要在类本身中定义可能与模块中定义的设置器冲突的属性读取器。我在发布问题时忘记了这部分。(来晚了^^)
澄清:这个类是供 DSL 编写配置文件的。它针对的是非开发人员,因此运营商越少越好。
我目前使用阻止的代理类来实现这一点,但为了设置值instance_eval
我必须搞砸,我不喜欢它。instance_variable_set
我只是在尝试另一种方法,看看是否可以使我的代码更具可读性。