2015-01-16 86 views
0

我想寫這2種方法,以便您可以輕鬆地在lazyeager之間切換。紅寶石渴望和懶惰的初始化

例如:

class Foo 
    lazy :bar do 
    "@bar was initializated lazily" 
    end 

    eager :bar2 do 
    "@bar2 was initializated eagerly" 
    end 
end 

f = Foo.new 
puts f.bar 
    # @bar was initializated lazily 
puts f.bar2 
    # @bar2 was initializated eagerly 

lazy方法是那種容易。它使用該名稱與attr_reader方法創建一個「getter」。並用塊的評估初始化變量。 這隻發生在你第一次調用''getter''

但是現在我必須寫出eager方法,這根本不容易,或者至少對我來說是不容易的。因爲,這種方法必須強制initialize來評估eager模塊的指令之後,初始化過程完全結束了,我沒有任何想法。

我試過在每個eager塊中擴展initialize,但是它的對象還沒有初始化,所以沒有工作。你有什麼主意嗎?現在我正在考慮擴展new方法,以便它調用另一個方法,它有一堆塊來正確評估和分配。但我認爲這有點危險。

回答

0

您可以使用Module#prepend鉤入Foo的初始化方法。我不知道你的eagerlazy方法的實現,或者它們是如何在Foo上定義的,但也許沿着這些方法會有什麼作用?

class Foo 
    prepend(Module.new do 
    def initialize(*args, &block) 
     super 
     @@_eager_initializers.each do |eager_initializer| 
     instance_variable_set(:"@#{eager_initializer.name}", eager_initializer.block.call) 
     end 
    end 
    end) 
end