我正在尝试在哈希中处理不一致的键(字符串/符号)。我认为HashWithIndifferentAccess将是答案,但我在尝试对这些哈希进行一些基本操作时会得到一些有些混乱的结果
例如,我有以下HashWithIndifferentAccess
(rdb:1) metadata
{"indexes"=>["respondent", "brand"], "columns"=>["rating"],
"value_labels"=>{}, "column_labels"=>{}}
(rdb:1) metadata.class
ActiveSupport::HashWithIndifferentAccess
当我尝试以下选择时,我得到一个空哈希
(rdb:1) metadata.select{ |k, v| [:indexes, :columns, :value_labels, :column_labels]
.include? k }
{}
HashWithIndifferentAccess是否可以使用所有常见的哈希操作?为什么此操作返回空哈希
答案 0 :(得分:3)
无差异的访问意味着HashWithIndifferentAccess#[]
将检查字符串和键。但是,Array#include?
上没有用于过滤数据的补丁。轻松修复:
[:indexes, :columns, :value_labels, :column_labels].include? k.to_sym
答案 1 :(得分:3)
你真正得到的HashWithIndifferentAccess
是能够使用字符串或键设置和获取值。一旦你开始在哈希上使用其他阅读方法,你就会转移到不的对象,而不是字符串或符号。
但是,HashWithIndifferentAccess
可以帮助您,因为:
当在整个书写界面中用作键时,内部符号被映射到字符串(调用[] =,merge等)
...
您可以保证密钥以字符串形式返回
这意味着您总是会使用select
等方法获取密钥字符串:
> h = { sym_key: 'sym_value', 'string_key' => 'string_value' }.with_indifferent_access
> h.keys
=> ["sym_key", "string_key"]