我有一个包含一些私有属性的类。我想要做的就是动态添加一些setter,仅用于执行特定块。仅扩展一个块调用
的,我想怎样能够例子:
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
编辑:谢谢到目前为止伟大的答案。我澄清了这个问题,因为我实际上需要在类中定义属性读取器,这可能与模块中定义的setter冲突。发布问题时我忘了这部分内容。 (已经晚了^^)
CLARIFICATION:这个类是为DSL写一个配置文件。它针对的是非开发人员,所以操作员越少越好。
我目前使用代理类实现这个,instance_eval
块,但我必须与instance_variable_set
混乱为了设置值,我不喜欢它。我只是想另一种方式来看看我能否让我的代码更具可读性。
类似有你编写自定义的作家任何理由,而不是使用attr_writer为你生成它们? – rampion 2009-06-10 11:36:58