我正在尝试将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)
创建了哈希!
我该如何避免这种行为?任何帮助将不胜感激!
答案 0 :(得分:3)
在PlayerCollection
中,您应该覆盖Hash#initialize
而不是Hash#new
。
未调用new
。这是被调用的类方法Hash.new
(或PlayerCollection.new
)。