Нет способа определить метод []+=
в ruby. Что происходит, когда вы набираете
x[y] += z
есть
x[y] = x[y] + z
поэтому оба метода []
и []=
вызываются на x
(а +
вызывается на x[y]
, что в данном случае является AutoHash
). Я думаю, что лучшим способом решения этой проблемы было бы определение метода +
для AutoHash
, который будет просто возвращать его аргумент. Это заставит AutoHash.new[:x] += y
работать практически для любого типа y
, потому что «пустая» версия y.class
(''
для строк, 0
для чисел, ...) плюс y
почти всегда равен y
.
class AutoHash
def +(x); x; end
end
Добавление этого метода сделает обе эти работы:
# Numbers:
a = AutoHash.new
5.times { a[:sum] += 10 }
a[:sum] #=> 50
# Strings:
a = AutoHash.new
5.times { a[:sum] += 'a string ' }
a[:sum] #=> "a string a string a string a string a string "
И, кстати, вот более чистая версия вашего кода:
class AutoHash < Hash
def initialize(args={})
super
@update, @update_index = args[:update], args[:update_key]
end
def [](k)
if 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 +(x); x; end
def self.few(n)
Array.new(n) { AutoHash.new }
end
end
:)