如果我有一个项目列表,并且每个项目我都在调用一个实例方法,那么如何保存该方法的值并防止它每次被调用时都被计算出来?
说我有两个项目:
<% if method_true %>
do something
<% end %>
<% if method_true %>
do something else
<% end %>
如果method_true == true,我怎样才能通过两个ifs传递值true
而不是每次都计算它?
答案 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