我有一个非Rails项目,我正在从YAML文件中加载一些设置:
config = YAML::load(File.open("#{LOG_ROOT}/config/database.yml"))
我只能像config["host"]
,config["username"]
等那样访问此哈希值。
我想要无关紧要的访问权限,因此我可以同时使用:host
和"host"
。
原因是,我传递此哈希的项目中的一个gem似乎是使用符号访问它并且它当前失败。
在这种情况下,创建具有无差别访问权限的哈希的最佳方法是什么?
答案 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
和其他人。)