评估和绑定:它们有用吗?

时间:2015-10-14 17:35:17

标签: ruby metaprogramming

根据ruby-doc.org<packaging>jar</packaging>将绑定对象作为第二个参数,如下所示:

kernel#eval

方法Const = 7 p eval("Const", binding) # => 7 可以与接受一个参数的方法eval返回的对象一起使用:

get_binding

在第一段代码中,我们得到def get_binding(param) return binding end n = get_binding(7) p eval("param", n) # => 7 的值,在第二段代码中,我们得到Const的值。如果我们使用parameval来检索我们已经知道的值,那么这些方法有用吗?

1 个答案:

答案 0 :(得分:3)

为了便于讨论,假设您正在使用模板引擎 - 它将处理给定的文本并将其中的Ruby代码替换为其值。我们可以使用eval

作为通用引擎,模板文本应该允许使用Ruby变量,其值将在调用者的绑定中定义。在这种情况下,通过将绑定传递给eval,我们可以允许用户的绑定用于变量评估。

基本的,不优雅的方法如下所示:

template = "Hello @first_name@ @last_name@"

def process(template, b)
    vars = template.scan(/@(\w+)@/).flatten
    vars.each {|v| template = template.gsub("@#{v}@", eval("#{v}", b)) }
    return template
end

first_name = "Wand"
last_name = "Maker"

str = process(template, binding)
p str
#=> "Hello Wand Maker"

first_name = "Rubeus"
last_name = "Hagrid"
p process(template, binding)
#=> "Hello Rubeus Hagrid"

在ERB中使用了一种类似的方法,Ruby的内置模板引擎。您可以查看source code