(大編輯,我有部分的方式...) 我一直在黑客攻擊,我想出了這個作爲一種方式來指定需要完成的事情屬性讀取之前:自定義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