1

我正在与 Ruby do/end 块作斗争。例如,我有以下示例:

::ApplicationController.class_eval do
  def close_sdb_connection
    puts "Closing sdb connection."       
  end
end

这段代码是做什么的?为什么我们需要积木?没有 do/end 块的等效代码是什么?

4

2 回答 2

2

通常,do...end{...}块用于将代码放入其中,该代码不会以与其余代码相同的方式进行评估。具体来说,一个块在某个绑定(即,局部变量和self关键字的某种赋值)下,在某个时间,被评估一定次数,所有这些都由该块所附加到的方法控制。

在这种特殊情况下,使用与外部不同的绑定来评估块。特别是,内部的代码将被评估为就好像它在接收器的类主体中一样::ApplicationController

于 2013-11-11T14:29:10.150 回答
2

doend是保留字。他们没有通用的更高目的(至少在马茨像拉里沃尔一样发疯并说他们这样做之前)。在您的示例代码中,外部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,因为块是局部变量的闭包。

有趣的是,并非每个都do ... end表示一个 block

于 2013-11-11T14:18:39.877 回答