Странное поведение при создании подкласса Hash
Я пытаюсь подклассифицировать Руби Hash
представить мое собственное поведение при доступе к определенному ключу. Для этого требуется дополнительный параметр при построении, поэтому я реализовал свой пользовательский хеш следующим образом:
class PlayerCollection < Hash
def new(server)
@server_player = SpecialPlayer.new(server, "Server")
super(nil)
end
def [](key)
key == "Server" ? @server_player : super(key)
end
def []=(key, value)
key == "Server" ? value : super(key, value)
end
end
Как видите, я звоню super
со значением nil
как я хотел бы вернуть мой хэш nil
когда значение не найдено в хэше. Тем не менее, мой хэш в конечном итоге возвращает server
объект, когда ключ не найден, как будто я создал свой хеш с Hash.new(server)
!
Как я могу избежать этого поведения? Любая помощь будет оценена!
1 ответ
Решение
В вашем PlayerCollection
перезаписать Hash#initialize
скорее, чем Hash#new
,
Тот new
не называется. Это метод класса Hash.new
(или же PlayerCollection.new
) который вызывается.