Ruby中do / end块的通用目的是什么?

时间:2013-11-11 14:14:46

标签: ruby-on-rails ruby block

我正在努力使用Ruby do / end块。 例如,我有以下示例:

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

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

2 个答案:

答案 0 :(得分:2)

doend是保留字。它们没有通用的更高目的(至少在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)明显不同,因为这些块是对局部变量的闭包。

值得注意的是,not each do ... end indicates a block

答案 1 :(得分:2)

一般情况下,do ... end{ ... }块用于将代码置于不同的内容中作为其余代码的方式。特别地,在某个特定时间点对某个块(即,局部变量的某个赋值和self关键字)进行特定时间的评估,所有这些都是通过以下方法控制的:块附加到。

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