Tag: memoization

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

考虑:生成数据的对象的许多实例。 每次运行只生成一次数据会很棒。 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 HighOfNPeriods不同实例有不同的params和不同的@source_data 。 以下是指标的使用方法: class Strategy attr_accessor :indicators def initialize params … end 从Strategy调用HighOfNPeriods.generate_data方法。 每个Strategy都会获得HighOfNPeriods的新实例,因此不可能将其作为某种全局值来实现。 除此之外,它不应该是全球性的。 unless @indicator_data不起作用,因为需要在HighOfNPeriods许多实例之间共享数据。 所以,问题是: What is a good way to memoize the instance variable `indicator_data` or […]

在方法调用中是否存在memoization约定?

我想避免重新评估方法调用中的值。 直到现在,我这样做: def some_method @some_method ||= begin # lot’s of code end end 但它最终很难看。 在某些代码中,我看到如下内容: def some_method @some_method ||= some_method! end private def some_method! # lot’s of code end 我不喜欢最后的爆炸声( ! ),所以我想出了这个: def some_method @some_method ||= _some_method end private def _some_method # lot’s of code end 是否以下划线作为一个好的约定? memoized / non-memoized对方法是否有其他约定? 是否有一些惯例来记忆多行方法?

如何在Ruby中记忆可能返回true,false或nil的方法?

显然||=不会起作用 def x? @x_query ||= expensive_way_to_calculate_x end 因为如果结果是false或nil ,那么expensive_way_to_calculate_x就会反复运行。 目前我知道的最好方法是将值放入Array : def x? return @x_query.first if @x_query.is_a?(Array) @x_query = [expensive_way_to_calculate_x] @x_query.first end 有更传统或更有效的方法吗? 更新我意识到我想记住除了false nil之外 – 这一直回到https://rails.lighthouseapp.com/projects/8994/tickets/1830-railscachefetch-does-not-work-with-false -boolean-as-cached-value – 我对Andrew Marshall道歉,他给出了一个完全正确的答案。