Странное поведение при создании подкласса 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) который вызывается.

Другие вопросы по тегам