如何创建动态全局和局部变量?

巴拉特

将json对象转为局部和全局变量,下面是代码

require 'json'
hash = '{"$a":5,"b":10}'
hash1 = JSON.parse(hash)
hash1.each do |k,v|
   singleton_class.send(:attr_accessor,k)
   send(eval("#{k}=",v))
end
puts $a

预期输出:

5
世界报

对这个答案持eval保留态度因为我不是 Ruby 的专家,但这对我有用:

require 'json'

hash = '{"$a":5,"b":10}'
hash1 = JSON.parse(hash)
bind = binding
hash1.each do |k,v|
  # Dunno what this is for and things work fine without it.
  # singleton_class.send(:attr_accessor,k)

  # You don't want to call `send` here, just call `eval` directly.
  eval("#{k}=#{v}", bind)
end
puts $a

请注意,我正在传递从父作用域到的绑定,eval因为b在退出循环后您将希望访问局部变量,例如在父作用域中。

最后,v需要成为传递给 的字符串的一部分eval,而不是传递给的第二个参数eval,如果有的话,它需要是一个绑定。如果您传递一个整数,它将引发异常。

但是,我应该警告您,应该克制地使用全局变量,并且使用eval可能很危险,特别是如果您从其他人那里获得此 JSON。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章