加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读