ruby – eval和binding:它们有用吗?

ruby – eval和binding:它们有用吗?,第1张

概述根据 ruby-doc.org,内核#eval将绑定对象作为第二个参数,如下所示: Const = 7p eval("Const", binding) # => 7 方法eval可以与方法get_binding返回的对象一起使用,该方法接受一个参数: def get_binding(param) return bindingendn = get_binding(7)p eval("p 根据 ruby-doc.org,内核#eval将绑定对象作为第二个参数,如下所示:

Const = 7p eval("Const",binding)  # => 7

方法eval可以与方法get_binding返回的对象一起使用,该方法接受一个参数:

def get_binding(param)  return bindingendn = get_binding(7)p eval("param",n)  # => 7

在第一段代码中,我们得到Const的值,在第二段代码中,我们得到了param的值.如果我们使用eval和binding来检索我们已经知道的值,那么这些方法有用吗?

解决方法 为了便于讨论,假设您正在使用模板引擎 – 它将处理给定的文本并将其中的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 templateendfirst_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

总结

以上是内存溢出为你收集整理的ruby – eval和binding:它们有用吗?全部内容,希望文章能够帮你解决ruby – eval和binding:它们有用吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1277083.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存