Hoje, publiquei uma nova gema chamada symbolized , que é basicamente uma duplicata do HashWithIndifferentAccess do ActiveSupport, mas em vez de armazenar chaves internamente como strings, elas são armazenadas como símbolos.
Por que eu iria querer isso?
Isso é particularmente útil quando você tem um grande número de hashes que compartilham as mesmas chaves, e pode se tornar ineficiente manter todas essas chaves idênticas como strings. Um exemplo desse caso é quando você tem pipelines de processamento de dados que processam milhões de hashes com as mesmas chaves.
Como pode ser usado?
Aqui está um snippet que demonstra o básico:
require 'symbolized'
# You can create a SymbolizedHash directly:
symbolized_hash = SymbolizedHash.new
symbolized_hash['a'] = 'b'
symbolized_hash['a'] #=> 'b'
symbolized_hash[:a] #=> 'b'
symbolized_hash.keys #=> [:a]
# Or initialize it with a normal hash:
symbolized_hash = SymbolizedHash.new({'a' => 'b'})
symbolized_hash['a'] #=> 'b'
symbolized_hash[:a] #=> 'b'
symbolized_hash.keys #=> [:a]
# Or use the Hash#to_symbolized_hash core extension:
h = { 'a' => 'b' }
h['a'] #=> 'b'
h[:a] #=> nil
h.keys #=> ['a']
symbolized_hash = h.to_symbolized_hash
symbolized_hash['a'] #=> 'b'
symbolized_hash[:a] #=> 'b'
symbolized_hash.keys #=> [:a]
Onde posso aprender mais sobre isso?
Você pode obter mais detalhes sobre a gema no repositório github:
https://github.com/TamerShlash/symbolized