Memoization vs Lazy初始化/评估

Aks*_*ite 5 ruby

Memoizationlazy initialization技术之间的确切区别是什么.

关于红宝石的例子会很棒.

Ere*_*bih 7

Memoization保存了长时间执行的结果,以便在再次调用时不再重复.

记忆的一个例子:

class A
  def initialize
  end

  def do_some_long_calculation
    @do_some_long_calculation ||= my_calc_here
  end
end
Run Code Online (Sandbox Code Playgroud)

这意味着一旦我们调用do_some_long_calculation结果将保存到@do_some_long_calculation后续调用将不会触发该my_calc_here方法.

延迟初始化仅在需要时执行此长执行,而不是在初始化对象时执行.

实际上第一个代码示例也演示了延迟初始化.非延迟初始化版本看起来像:

class A
  def initialize
    @do_some_long_calculation = my_calc_here
  end

  def do_some_long_calculation 
    @do_some_long_calculation 
  end
end
Run Code Online (Sandbox Code Playgroud)

如您所见,这里我们立即在A类的init上进行冗长的计算,而在第一个示例中,我们只在调用精确方法时进行计算.

长计算仍然只进行一次,但是在类的初始化时而不是在显式调用时.