Como lidar com a combinação [] + = para hash de vivivação automática em Ruby?
Para implementar a auto-vivificação do hash Ruby, pode-se empregar a seguinte classe
class AutoHash < Hash
def initialize(*args)
super()
@update, @update_index = args[0][:update], args[0][:update_key] unless
args.empty?
end
def [](k)
if self.has_key?k
super(k)
else
AutoHash.new(:update => self, :update_key => k)
end
end
def []=(k, v)
@update[@update_index] = self if @update and @update_index
super
end
def few(n=0)
Array.new(n) { AutoHash.new }
end
end
Esta classe permite fazer o seguinte
a = AutoHash.new
a[:a][:b] = 1
p a[:c] # => {} # key :c has not been created
p a # => {:a=>{:b=>1}} # note, that it does not have key :c
a,b,c = AutoHash.new.few 3
b[:d] = 1
p [a,b,c] # => [{}, {:d=>1}, {}] # hashes are independent
Há simdefinição um pouco mais avançada desta classeproposto por Joshua, o que é um pouco difícil para mim entender.
Problema
Há uma situação em que acho que a nova classe pode ser melhorada. O código a seguir falha com a mensagem de erroNoMethodError: undefined method '+' for {}:AutoHash
a = AutoHash.new
5.times { a[:sum] += 10 }
O que você faria para lidar com isso? Pode-se definir[]+=
operador?
Perguntas relacionadas
A inicialização automática da matriz de hash multidimensional é possível no Ruby, como no PHP?Inicialização múltipla de hashes de auto-vivificação usando um novo operador em Ruby ruby hash initialization rAinda aberto: Como criar um operador para cópia / clonagem profunda de objetos no Ruby?