在 Ruby 中跨类的多个实例记忆数据的好方法是什么?

B S*_*ven 5 ruby object instance-variables instance memoization

考虑:生成数据的对象的许多实例。每次运行只生成一次该数据会很棒。

class HighOfNPeriods < Indicator
  def generate_data
    @indicator_data = DataStream.new
    (0..@source_data.data.count - 1).each do |i|
      if i < @params[:n_days]
      ...
      @indicator_data.add one_data
    end
  end
Run Code Online (Sandbox Code Playgroud)

有不同的情况HighOfNPeriods用不同的params和不同的@source_data

以下是该指标的使用方法:

class Strategy
  attr_accessor :indicators

  def initialize params
    ...
  end
Run Code Online (Sandbox Code Playgroud)

该方法HighOfNPeriods.generate_data是从内部调用的Strategy。每个Strategy都有一个 的新实例HighOfNPeriods,因此不可能将其作为某种全局值提取出来。除此之外,它不应该是全球性的。

unless @indicator_data不起作用,因为数据需要在HighOfNPeriods.

所以,问题是:

What is a good way to memoize the instance variable `indicator_data` 
or the object `HighOfNPeriods` when there are many different instances, 
some of which have different data?
Run Code Online (Sandbox Code Playgroud)

一种解决方案是使用 ActiveRecord 存储数据,但这并不是我目前真正想要的方式,因为:

  1. 并不是所有生成的数据都可以提前生成,因为params的排列太多了。查看它之前是否已生成,然后根据需要生成(并保存)更有意义。
  2. 生成数据不需要很长时间。它可以生成一次并在每次运行中使用数百次。
  3. 从对象内部访问数据比从数据库中提取数据要快。

红宝石 1.9.3

saw*_*awa 1

创建一个类变量,@@indicator_data该变量是一个哈希值,其中[@params,@source_data]键为键,@indicator_data值为值。然后,在创建时,对 进行记忆@@indicator_data[[@params,@source_data]]

class HighOfNPeriods < Indicator
  @@indicator_data = {}
  def generate_data
    @indicator_data = @@indicator_data[[@params, @source_data]] ||= DataStream.new
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)