31

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

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

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

我想要冷漠的访问,所以我可以同时使用:host"host"

原因是,我将这个哈希传递给的项目中的一个 gem 似乎正在使用符号访问它,但它目前失败了。

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

4

2 回答 2

53

通过安装 Active Support gem,您只会损失几 kB 的磁盘空间。在您的代码中,您只需要所需的功能:

require 'active_support/core_ext/hash/indifferent_access'

这样一来,您就可以确保您没有得到任何其他东西来弄乱您的命名空间。

于 2012-05-28T09:01:10.053 回答
19

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

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"]将导致 nil 。:host如果这也必须工作:

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和其他)。

于 2012-05-28T14:51:52.603 回答