我正在努力使用Ruby do / end块。 例如,我有以下示例:
::ApplicationController.class_eval do
def close_sdb_connection
puts "Closing sdb connection."
end
end
这段代码的作用是什么?为什么我们需要积木?没有do / end块的等效代码是什么?
答案 0 :(得分:2)
do
和end
是保留字。它们没有通用的更高目的(至少在Matz像拉里沃尔那样疯狂并且说他们这样做之前)。在示例代码中,外部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
)明显不同,因为这些块是对局部变量的闭包。
答案 1 :(得分:2)
一般情况下,do
... end
或{
... }
块用于将代码置于不同的内容中作为其余代码的方式。特别地,在某个特定时间点对某个块(即,局部变量的某个赋值和self
关键字)进行特定时间的评估,所有这些都是通过以下方法控制的:块附加到。
在这种特殊情况下,使用与外部不同的绑定来评估块。特别是,里面的代码将被评估为好像它在接收器::ApplicationController
的类体内。