这两个代码片段有什么区别:
def config @config ||= begin if config_exists? @config = return some value else {} end end end
和
def config @config ||= method end def method if config_exists? return some value else {} end end
我对" begin
...... end
"块感到困惑.输出有什么不同吗?如果没有,那么begin
... end
块的使用是什么?
首先,您需要知道定义的方法本身就包含begin ... end
块的功能.
在异常处理的上下文中,def method_name ... end
在功能上等同于begin ... end
.两者都可以包含rescue
例如语句.
您共享的两个代码块实际上是相同的,并且在一个代码中没有任何好处......除非您method
需要多个代码.在这种情况下,通过将逻辑放入单个方法并从多个其他位置调用它来干掉代码.
在您的情况下,您甚至可以省略begin ... end
块:
@config ||= if config_exists? return_some_value else {} end
或者,使用三元if:
@config ||= config_exists? ? return_some_value : {}
它的输出有什么不同吗?
它可能会有所不同,因为与块不同def ... end
,begin ... end
块不会创建新的变量范围.
这是一个人为的例子:
def foo a = 456 # doesn't affect the other a end a = 123 b = foo p a: a, b: b #=> {:a=>123, :b=>456}
与:
a = 123 b = begin a = 456 # overwrites a end p a: a, b: b #=> {:a=>456, :b=>456}
使用||= begin...end
允许您记住在中运行的任何内容的结果begin...end
.这对于缓存资源密集型计算的结果很有用.