ruby – eval和binding:它们有用吗?
发布时间:2020-12-17 02:25:01 所属栏目:百科 来源:网络整理
导读:根据 ruby-doc.org,内核#eval将绑定对象作为第二个参数,如下所示: Const = 7p eval("Const",binding) # = 7 方法eval可以与方法get_binding返回的对象一起使用,该方法接受一个参数: def get_binding(param) return bindingendn = get_binding(7)p eval("pa
根据
ruby-doc.org,内核#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和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 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |