我正在与 Ruby do/end 块作斗争。例如,我有以下示例:
::ApplicationController.class_eval do
def close_sdb_connection
puts "Closing sdb connection."
end
end
这段代码是做什么的?为什么我们需要积木?没有 do/end 块的等效代码是什么?
我正在与 Ruby do/end 块作斗争。例如,我有以下示例:
::ApplicationController.class_eval do
def close_sdb_connection
puts "Closing sdb connection."
end
end
这段代码是做什么的?为什么我们需要积木?没有 do/end 块的等效代码是什么?
通常,do
...end
或{
...}
块用于将代码放入其中,该代码不会以与其余代码相同的方式进行评估。具体来说,一个块在某个绑定(即,局部变量和self
关键字的某种赋值)下,在某个时间,被评估一定次数,所有这些都由该块所附加到的方法控制。
在这种特殊情况下,使用与外部不同的绑定来评估块。特别是,内部的代码将被评估为就好像它在接收器的类主体中一样::ApplicationController
。
do
和end
是保留字。他们没有通用的更高目的(至少在马茨像拉里沃尔一样发疯并说他们这样做之前)。在您的示例代码中,外部do ... end
表示代码块 - 与{ ... }
. 内部end
用作def ... end
方法定义的右分隔符。
在 的上下文中class_eval
,OP 中的代码示例与以下内容完全相同:
class ::ApplicationController
def close_sdb_connection
puts "Closing sdb connection."
end
end
但是,块语句(例如)Foo.class_eval do ... end
与非块语句(例如 )有很大不同class Foo; ... end
,因为块是局部变量的闭包。