能够写出
非常好@foo ||= "bar_default"
或
@foo ||= myobject.bar(args)
但我一直在寻找是否有办法写出像
这样的东西@foo ||= do
myobject.attr = new_val
myobject.other_attr = other_new_val
myobject.bar(args)
end
在实际功能代码中大致等同于
@foo = if !@foo.nil?
@foo
else
myobject.attr = new_val
myobject.other_attr = other_new_val
myobject.bar(args)
end
我想我可以编写自己的全局方法,如“getblock”来包装并返回任何常规块的结果,但我想知道是否已经有一种内置的方法来执行此操作。
答案 0 :(得分:39)
您可以使用begin
.. end
:
@foo ||= begin
# any statements here
end
或者可能考虑将块的内容分解为单独的方法。
答案 1 :(得分:3)
我通常这样写:
@foo ||= (
myobject.attr = new_val
myobject.other_attr = other_new_val
myobject.bar(args)
)
答案 2 :(得分:0)
@foo ||= unless @foo
myobject.attr = new_val
myobject.other_attr = other_new_val
myobject.bar(args)
end