Ruby中的懒惰评估

前端之家收集整理的这篇文章主要介绍了Ruby中的懒惰评估前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个Ruby的情况,可能需要创建一个对象,但不能确定.而且由于对象的创建可能是昂贵的,我不是太急于创建它.我认为这是一个明显的懒惰加载的情况.如何定义只有在有人向其发送消息时才创建的对象?该对象将在块中创建.有没有办法在Ruby中进行简单的懒惰加载/初始化?这些东西是由某些宝石支持的,为各种懒惰初始化对象提供不同的解决方案?感谢您的建议!

解决方法

有两种方法

第一个是让调用者处理懒惰对象的创建.这是最简单的解决方案,它是Ruby代码中非常常见的模式.

class ExpensiveObject
  def initialize
    # Expensive stuff here.
  end
end

class Caller
  def some_method
    my_object.do_something
  end

  def my_object
    # Expensive object is created when my_object is called. Subsequent calls
    # will return the same object.
    @my_object ||= ExpensiveObject.new
  end
end

第二个选择是让对象简单地进行初始化.我们在实际对象周围创建一个委托对象来实现这一点.这种方法有点棘手,不推荐,除非你有现有的调用代码,你不能修改,例如.

class ExpensiveObject        # Delegate
  class RealExpensiveObject  # Actual object
    def initialize
      # Expensive stuff here.
    end

    # More methods...
  end

  def initialize(*args)
    @init_args = args
  end

  def method_missing(method,*args)
    # Delegate to expensive object. __object method will create the expensive
    # object if necessary.
    __object__.send(method,*args)
  end

  def __object__
    @object ||= RealExpensiveObject.new(*@init_args)
  end
end

# This will only create the wrapper object (cheap).
obj = ExpensiveObject.new

# Only when the first message is sent will the internal object be initialised.
obj.do_something

您也可以使用stdlib delegate来构建它.

猜你在找的Ruby相关文章