我是Ruby新手,我正在学习阅读已编写的代码。 我遇到了这段代码:
label = TkLabel.new(@root) do
text 'Current Score: '
background 'lightblue'
end
上面的语法“do”的语义是什么? 我玩它并且似乎创建一个TkLabel对象然后将其类变量text和background设置为quote中指定的内容。但是,当我尝试对我创建的类做同样的事情时,这不起作用。
哦,是的,也是关于将哈希传递给函数,例如
object.function('argument1'=>123, 'argument2'=>321)
如何创建一个接受这种论证的函数?
提前致谢
答案 0 :(得分:4)
您所看到的通常被称为DSL或域特定语言。
乍一看,可能不清楚为什么你看到的代码有效,因为text
和background
似乎是未定义的,但这里的诀窍是该代码实际上是在一个范围内进行评估的他们是。最简单的是,驱动它的代码看起来像这样:
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
位),以及一些接受字符串参数来设置特定属性的方法。
如果不知道你是怎么做到的,那么很难超越它。以下是few,possible,references可能会帮助您解决一些初步障碍。
Ruby在制作缩小版internal DSLs方面相当不错,因为它能够接受块及其宽容(如果有时是奥术)语法。