我通常使用"一次性作业" (在这个红宝石中,我真的不知道怎么称呼这个):
class FooBar
def foo
@foo ||= begin
# Costly operation putting here
end
end
end
这将允许变量@foo
仅计算一次,然后直接用于对方法foo
的后续调用。我的问题是:
begin
/ end
块是否合适,因为文档声明它用于封装异常,不提及任何其他用途。do
/ end
)吗?如果是,那么如何?答案 0 :(得分:2)
我在记忆中没有看到begin/end
的任何用法,但我认为没问题。
当然,您可以使用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_XXX
或process_XXX
的方法清楚地解释了它做了更多的事情,并且在公开可访问的方法中进行了记忆,这清楚地表明你正在避免如果需要,不止一次这样做。