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.9.3
创建一个类变量,@@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)