这个“do ... end”的语义是什么

时间:2011-11-25 03:16:31

标签: ruby

我是Ruby新手,我正在学习阅读已编写的代码。 我遇到了这段代码:

label = TkLabel.new(@root) do
    text 'Current Score: '   
    background 'lightblue'
end

上面的语法“do”的语义是什么? 我玩它并且似乎创建一个TkLabel对象然后将其类变量text和background设置为quote中指定的内容。但是,当我尝试对我创建的类做同样的事情时,这不起作用。

哦,是的,也是关于将哈希传递给函数,例如

object.function('argument1'=>123, 'argument2'=>321)

如何创建一个接受这种论证的函数?

提前致谢

2 个答案:

答案 0 :(得分:4)

您所看到的通常被称为DSL或域特定语言。

乍一看,可能不清楚为什么你看到的代码有效,因为textbackground似乎是未定义的,但这里的诀窍是该代码实际上是在一个范围内进行评估的他们是。最简单的是,驱动它的代码看起来像这样:

class TkLabel
  def initialize(root, &block)
    @root = root

    if block
      # the code inside the block in your app is actually
      # evaluated in the scope of the new instance of TkLabel
      instance_eval(&block)
    end
  end

  def text(value)
    # set the text
  end

  def background(value)
    # set the background
  end
end

答案 1 :(得分:2)

第二个问题:那只是一个哈希。创建一个接受单个参数的函数,并将其视为散列。

“语义”是initialize接受一个块(do...end位),以及一些接受字符串参数来设置特定属性的方法。

如果不知道你是怎么做到的,那么很难超越它。以下是fewpossiblereferences可能会帮助您解决一些初步障碍。

Ruby在制作缩小版internal DSLs方面相当不错,因为它能够接受块及其宽容(如果有时是奥术)语法。