我有非常具体的情况
我已经用 json 条目分隔了文件:
{
"field": "value",
"field2": "#{Time.now + (24*60*60)).to_i.to_s}"
}
在我使用 IO.read(file) 加载此内容后,我想在该值中定义日期执行代码
这个怎么做?
我将使用以下方法进行操作YAML
:
require 'yaml'
require 'time'
h = {
"field" => "value",
"field2" => "#{(Time.now + (24*60*60)).to_i.to_s}"
}
p YAML.load(YAML.dump(h))
# => {"field"=>"value", "field2"=>"1377092990"
require 'yaml'
require 'time'
h = {
"field" => "value",
"field2" => "#{Time.now}"
}
p YAML.load(YAML.dump(h))
# => {"field"=>"value", "field2"=>"2013-08-20 19:23:12 +0530"}
另一个答案更快
YAML.load(YAML.dump(hash))
我认为您正在寻找的是Kernal#eval
方法。这将运行包含在字符串中的代码。
eval('2 + 2') # => 5
您可能必须先运行正则表达式。请参阅Rubular 此处的示例。
/#{([^}]*)}/
都说了又做了。
json["field2"].gsub!(/#\{([^}]*)\}/) { eval($1) }
如果您想对哈希中的每个值执行此操作。
json.each_value do |value|
v.gsub!(/#\{([^}]*)\}/) { eval($1) }
end
参考: