Ruby:扩展哈希构造函数

时间:2013-06-13 11:44:16

标签: ruby

我是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,但这并不能让我接受初始哈希。

1 个答案:

答案 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

这当然是公开的,所以如果你试图隐藏它,那个更有气味的第一版可能会更好。