¿Cómo manejar la combinación [] + = para el hash auto-vivificante en Ruby?
Para implementar la auto-vivificación de Ruby hash, se puede emplear la siguiente clase
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 clase permite hacer las siguientes cosas
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
Ahi estadefinición un poco más avanzada de esta clasepropuesto por Joshua, lo cual es un poco difícil de entender para mí.
Problema
Hay una situación en la que creo que la nueva clase se puede mejorar. El siguiente código falla con el mensaje de errorNoMethodError: undefined method '+' for {}:AutoHash
a = AutoHash.new
5.times { a[:sum] += 10 }
¿Qué harías para manejarlo? ¿Se puede definir[]+=
¿operador?
Preguntas relacionadas
¿Es posible la inicialización automática de la matriz hash multidimensional en Ruby, como lo es en PHP?Inicialización múltiple de hash auto-vivificantes usando un nuevo operador en Ruby ruby hash initialization rSigue abierto: ¿Cómo crear un operador para copia profunda / clonación de objetos en Ruby?