根据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
的值。如果我们使用param
和eval
来检索我们已经知道的值,那么这些方法有用吗?
答案 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