将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] 删除。
我来说两句