(大编辑,我有部分的方式...) 我一直在黑客攻击,我想出了这个作为一种方式来指定需要完成的事情属性读取之前:自定义attr_reader做属性的懒惰实例化
class Class
def attr_reader(*params)
if block_given?
params.each do |sym|
define_method(sym) do
yield
self.instance_variable_get("@#{sym}")
end
end
else
params.each do |sym|
attr sym
end
end
end
end
class Test
attr_reader :normal
attr_reader(:jp,:nope) { changethings if @nope.nil? }
def initialize
@normal = "Normal"
@jp = "JP"
@done = false
end
def changethings
p "doing"
@jp = "Haha!"
@nope = "poop"
end
end
j = Test.new
p j.normal
p j.jp
但changethings
没有被公认的方法 - 任何人有任何想法?
它看起来像在类对象的范围正在执行我的attr_reader块,而不是它的实例。关于如何强制实例的任何想法? – 2010-07-14 16:09:48
您可以使用'instance_eval'而不是yield,并将block作为参数。但它闻起来有点。 – 2010-07-14 16:18:43