子类化Hash时的奇怪行为

时间:2013-03-27 19:06:31

标签: ruby subclass

我正在尝试将Ruby的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 个答案:

答案 0 :(得分:3)

PlayerCollection中,您应该覆盖Hash#initialize而不是Hash#new

未调用new。这是被调用的类方法Hash.new(或PlayerCollection.new)。