Ruby在实例变量上的一次赋值

时间:2014-07-23 05:29:36

标签: ruby

我通常使用"一次性作业" (在这个红宝石中,我真的不知道怎么称呼这个):

class FooBar
    def foo
       @foo ||= begin
           # Costly operation putting here
       end 
    end
end

这将允许变量@foo仅计算一次,然后直接用于对方法foo的后续调用。我的问题是:

  1. 在这种情况下使用begin / end块是否合适,因为文档声明它用于封装异常,不提及任何其他用途。
  2. 我可以使用其他块类型(Proc,Lambda,do / end)吗?如果是,那么如何?

2 个答案:

答案 0 :(得分:2)

  1. 我在记忆中没有看到begin/end的任何用法,但我认为没问题。

  2. 当然,您可以使用lambda这样的@foo ||= lambda { "foo" }.call,只需记住一次性作业||=)仅评估过程当@foo评估为false时。它等同于以下内容:

    if @foo
      @foo
    else
      @foo = lambda { "foo" }.call
    end
    

答案 1 :(得分:1)

我通常会这样做:

class MyClass

  def foo
    @foo ||= build_foo
  end

  private

  def build_foo
    puts "I'm expensive"
    5
  end

end

我不明白为什么你需要让它变得更复杂。我的眼睛有一个名为build_XXXprocess_XXX的方法清楚地解释了它做了更多的事情,并且在公开可访问的方法中进行了记忆,这清楚地表明你正在避免如果需要,不止一次这样做。