哈希与漠不关心的访问

时间:2012-05-28 07:22:52

标签: ruby

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

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

我只能像config["host"]config["username"]等那样访问此哈希值。

我想要无关紧要的访问权限,因此我可以同时使用:host"host"

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

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

2 个答案:

答案 0 :(得分:50)

通过安装Active Support gem,除了几KB的磁盘空间外,什么都不会丢失。在您的代码中,您只需要所需的功能:

require 'active_support/core_ext/hash/indifferent_access'

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

答案 1 :(得分:19)

让config hash返回键的字符串化版本的值:

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都会运行。请注意,这只是无关紧要的访问权限的一半:如果密钥config["host"]存在,: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

请参阅有关此方法限制的评论(tltr::a'a'的单独值是可能的,不考虑Hash.delete和其他人。)