我是Ruby的新手,如果我的术语在这里不正确,请道歉。
我正在尝试创建哈希的子类,但是在初始化时遇到了问题。我希望能够使用现有哈希以及一些其他参数对其进行初始化,例如:
x = NewHash[{:a => b}, extra_param]
我尝试通过覆盖静态Hash []运算符来实现这一点:
class NewHash < Hash
def self.[](hash_values, backend = nil)
@backend = backend
super(hash_values)
end
end
这不起作用,因为[]运算符是静态的,我无法访问非静态成员变量,即@backend
丢失。
我能做些什么吗?另一种方法是使用new
,但这并不能让我接受初始哈希。
答案 0 :(得分:1)
这有点hacky,因为[]不是哈希构造函数;这是一种工厂方法。因此,没有真正干净的方法来获得新哈希的私有范围。
您可以这样做:
class NewHash < Hash
def self.[](hash_values, backend = nil)
super(hash_values).tap do |hash|
hash.instance_variable_set("@backend", backend)
end
end
end
这需要使用instance_variable_set
,这通常被认为是臭的,但它有效。另一种方法是创建公共访问者:
class NewHash < Hash
attr_accessor :backend
def self.[](hash_values, backend = nil)
super(hash_values).tap do |hash|
hash.backend = backend
end
end
end
这当然是公开的,所以如果你试图隐藏它,那个更有气味的第一版可能会更好。