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:它们有用吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)