哈希与漠不关心的访问

我有一个非Rails项目,我在其中加载YAML文件中的一些设置:

config = YAML::load(File.open("#{LOG_ROOT}/config/database.yml")) 

我只能访问这个哈希,如config["host"]config["username"]等。

我想要无所谓访问,所以我可以同时使用:host"host"

原因是,我传递此哈希的项目中的一个gem似乎是使用符号访问它,它当前失败了。

在这种情况下,创建具有无差别访问权限的哈希的最佳方法是什么?

让配置哈希返回键的字符串化版本的值:

 config = {"host"=>"value1", "Username"=>"Tom"} config.default_proc = proc{|h, k| h.key?(k.to_s) ? h[k.to_s] : nil} p config[:host] #=> "value1" 

每次在散列中找不到键时, default_proc都会运行。 请注意,这只是无关紧要的访问的一半:如果key :host存在, config["host"]将导致nil。 如果这也必须工作:

 config.default_proc = proc do |h, k| case k when String then sym = k.to_sym; h[sym] if h.key?(sym) when Symbol then str = k.to_s; h[str] if h.key?(str) end end 

除了几KB的磁盘空间外,通过安装Active Support gem,您几乎不会丢失任何内容。 在您的代码中,您只需要您想要的function:

 require 'active_support/core_ext/hash/indifferent_access' 

这样,你可以确定你没有得到任何其他东西来搞乱你的命名空间。