Ruby Hash 字符串和符号做键值混合问题

bzhang443 · 2015年08月05日 · 最后由 hiveer 回复于 2015年08月05日 · 2470 次阅读

问题是这样的:用符号做键值生成的 Hash,然后用 json 形式存储到缓存中;下次使用时如果缓存命中,拿出缓存中的数据解析成 Hash,这样拿到的 Hash 键值就是字符串了。头疼的是,同样的数据,要区分是生成的还是缓存的,因为键值形式不一样。 例子是,原始数据 h={a: 1, b: 2},然后 h.to_json 存到缓存,拿出来的时候再 JSON.parse,得到 h2={"a"=>1, "b"=>2} 请教大家:有什么简单的方式能处理这种问题,能透明处理符号和字符串的键值。 还是我应该只使用字符串,这样肯定没问题。

可以看看 HashWithIndifferentAccess,这样就不用区分了

rgb = ActiveSupport::HashWithIndifferentAccess.new

rgb[:black] = '#000000'
rgb[:black]  # => '#000000'
rgb['black'] # => '#000000'

rgb['white'] = '#FFFFFF'
rgb[:white]  # => '#FFFFFF'
rgb['white'] # => '#FFFFFF'

参考 ActiveSupport::HashWithIndifferentAccess

[67] pry(main)> h = {'one' => 1, two: 2}
=> {"one"=>1, :two=>2}
[68] pry(main)> h['two']
=> nil
[69] pry(main)> h.with_indifferent_access
=> {"one"=>1, "two"=>2}
[70] pry(main)> h
=> {"one"=>1, :two=>2}
[71] pry(main)> h.with_indifferent_access['two']
=> 2
需要 登录 后方可回复, 如果你还没有账号请 注册新账号