【问题标题】:Ruby: How to execute part of codes from loaded fileRuby:如何从加载的文件中执行部分代码
【发布时间】:2013-08-20 13:19:47
【问题描述】:

我有非常具体的情况

我已经用 json 条目分隔文件:

    {  
        "field": "value",  
        "field2": "#{Time.now + (24*60*60)).to_i.to_s}"  
    }  

使用 IO.read(file) 加载此内容后,我想在该值中定义日期执行代码

如何做到这一点?

【问题讨论】:

    标签: ruby json file load


    【解决方案1】:

    我将使用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"}
    

    【讨论】:

    • 你知道,当我在代码中定义字符串时一切正常,但问题是当我的字符串 (json) 从文件中加载时
    【解决方案2】:

    另一个答案更快

    YAML.load(YAML.dump(hash))
    

    我认为您正在寻找的是Kernal#eval 方法。这将运行包含在字符串中的代码。

    eval('2 + 2') # => 5
    

    您可能必须先运行正则表达式。查看示例here at Rubular

    /#{([^}]*)}/
    

    言归正传。

    json["field2"].gsub!(/#\{([^}]*)\}/) { eval($1) }
    

    如果您想对哈希中的每个值都执行此操作。

    json.each_value do |value|
      v.gsub!(/#\{([^}]*)\}/) { eval($1) }
    end
    

    参考资料:

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2015-10-20
      • 2020-09-18
      • 1970-01-01
      相关资源
      最近更新 更多