【问题标题】:Ruby eager and lazy initializationRuby 急切和延迟初始化
【发布时间】:2015-01-16 18:54:34
【问题描述】:

我正在尝试编写这两种方法,以便您可以轻松地在lazy 和eager 之间切换。

例如:

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 块的指令 AFTER 初始化完全完成,我不知道。

我已经尝试在每个eager 块中扩展initialize,但它尚未初始化的对象,所以这不起作用。你有什么主意吗?现在我正在考虑扩展new 方法,以便它调用另一个方法,该方法有一堆块可以正确评估和分配。但我觉得这样做有点冒险。

【问题讨论】:

    标签: ruby lazy-loading eager-loading


    【解决方案1】:

    您可以使用Module#prepend 挂钩Foo 的初始化方法。我不知道您的eager 和lazy 方法的实现,或者它们是如何在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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      相关资源
      最近更新 更多