如何保存实例方法的值?

时间:2015-02-19 17:48:36

标签: ruby-on-rails methods load

如果我有一个项目列表,并且每个项目我都在调用一个实例方法,那么如何保存该方法的值并防止它每次被调用时都被计算出来?

说我有两个项目:

<% if method_true %>
  do something
<% end %>
<% if method_true %>
  do something else
<% end %>

如果method_true == true,我怎样才能通过两个ifs传递值true而不是每次都计算它?

2 个答案:

答案 0 :(得分:1)

我确定那里有更复杂的答案,但对于我的应用,我只是将值保存在实例变量中。

<强>模型

def method_true
  #...
end

查看

<% if @model.method_true.true? %>
  <% @x = true %>
<% end %>

之后,您可以使用

<% if @x == true %>

而不是

<% if @model.method_true.true? %>

并且该方法不必重新计算。如果method_true不是真的,那么@x将为零,因此if?条件不会被执行。

答案 1 :(得分:1)

你可以memoize method_true?(根据惯例,返回布尔值的Ruby方法以问号结尾)。

如果your expensive calculation只能是真/假:

def method_true?
  if @method_true.nil?
    @method_true = # your expensive calculation
  end
  @method_true
end

如果你也在关注memoizing nil:

def method_true?
  unless defined?(@method_true)
    @method_true = # your expensive calculation
  end
  @method_true
end

StackOverflow question on memoizing true/false/nil