【问题标题】:How can I save the value of an instance method?如何保存实例方法的值?
【发布时间】:2015-04-21 05:00:16
【问题描述】:

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

假设我有两个项目:

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

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

【问题讨论】:

  • 您是否对列表中的每个项目都调用item.method_true?还是辅助方法?
  • @messanjah 实际上,我同时使用这两种方法,因此问题不一定针对任何一种。为什么,两者的计算方式不同?
  • 这可能很重要。如果每个项目都可以返回不同的值,那么您就不想保存其中一个以重复使用。

标签: ruby-on-rails methods load


【解决方案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? 条件将不会被执行。

【讨论】:

  • 哇...我期待着必须做一些超级复杂的事情,包括计数器缓存或其他东西,所以我什至没有想到它会这么简单...谢谢。我会尽快奖励赏金。
【解决方案2】:

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

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

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

如果你也关心记忆 nil:

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

StackOverflow question on memoizing true/false/nil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2023-03-05
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多