【问题标题】:What is the generic purpose of do/end blocks in RubyRuby 中 do/end 块的一般用途是什么
【发布时间】:2013-11-11 14:14:45
【问题描述】:

我正在为 Ruby 的 do/end 块而苦苦挣扎。 例如,我有以下示例:

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

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

【问题讨论】:

  • 您的问题是关于什么:do/end 块或class_eval 函数?
  • 也许两者兼而有之。我想首先了解 do/end 块的一般用途及其在其他语言中的等价物。它们是匿名块吗?
  • This article 可能会有所帮助。

标签: ruby-on-rails ruby block


【解决方案1】:

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)显着不同,因为块是局部变量的闭包。

有趣的是,not each do ... end indicates a block.

【讨论】:

  • 在 class_eval 的上下文中,这个块有什么作用?谢谢!
  • 谷歌搜索 [Ruby yield block_given?] 了解内幕。 do-end 获取一段代码并将其句柄传递给方法。然后,该方法可以存储句柄以供以后评估,或立即评估。该方法可以在调用该块之前和之后更改条件。该方法还可以更改该块查找其变量的方式。这就是class_eval 正在做的事情。
  • 谢谢。如果我有以下代码:tag 'children:first' do |tag| ... end 'children:first' 的作用是什么? tag的第一个参数?
  • @pinker: 'children:first' 是一个字符串,它对 Ruby 本身没有特殊意义。 #tag 方法程序员有责任在方法的文档中描述方法参数及其含义,如果 ze 没有这样做,请投诉。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-04-10
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多