Ruby 访问无关的散列

Ruby 访问无关的散列,ruby,Ruby,我有一个非Rails项目,其中我正在从YAML文件加载一些设置: config = YAML::load(File.open("#{LOG_ROOT}/config/database.yml")) 我只能像config[“host”],config[“username”]等那样访问此散列 我需要不同的访问权限,以便可以同时使用:host和“host” 原因是,我将这个散列传递给的项目中的一个宝石似乎是使用符号访问它的,而它目前失败了 在这种情况下,创建具有不同访问权限的散列的最佳方法是什么?通

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

config = YAML::load(File.open("#{LOG_ROOT}/config/database.yml"))
我只能像
config[“host”]
config[“username”]
等那样访问此散列

我需要不同的访问权限,以便可以同时使用
:host
“host”

原因是,我将这个散列传递给的项目中的一个宝石似乎是使用符号访问它的,而它目前失败了


在这种情况下,创建具有不同访问权限的散列的最佳方法是什么?

通过安装活动的Support gem,除了几kB的磁盘空间之外,您不会损失任何东西。在代码中,您只需要所需的函数:

require 'active_support/core_ext/hash/indifferent_access'

通过这种方式,您可以确保不会有任何其他内容扰乱您的命名空间。

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

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'
的单独值是可能的,不考虑
散列。删除
和其他内容)。

即使您不使用rails,也有任何原因不能
要求“主动支持/core\ext/Hash/anistance\u访问”
,这就是你的解决方案吗?我还没有安装active_support gem,我想知道我是否应该安装它只是为了获得此功能。如果你不想,请使用不同的访问类将代码复制/粘贴到你自己的哈希中。我还没有看过Rails的解决方案,但我自己也写过一个,不能超过50 LOC。我也考虑过。检查一下这里,看看是否有更好的方法。我是ruby新手,所以想为什么不向社区询问一下,以防我错过了什么。我愿意复制。这将适用于通过
[]
访问,但不适用于
删除
等需要提供正确版本密钥的操作。请注意,这并不会阻止用户添加两个键:“host”和:host,并指定不同的值!如果哈希中有key'host'并添加key:host,则第二个不会覆盖第一个!是的,但是像这样的中断:(-“%{version}”%{version:5}。使用\u interference\u access.to\u hash,因为我猜测的是内部字符串而不是符号:(有趣的观察。你实际上教了我一个我在这里都不知道的技巧:-),我明白了,它确实不适用于那些与ActiveSupport无关的散列。在很短的时间内,我无法说这是否可以补救,但如果您愿意向ActiveSupport开发人员提交一份这样的通知单,您将为Ruby社区做一件好事。