0

我是 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,但这并没有给我一个接受初始哈希的好方法。

4

1 回答 1

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

这当然是公开的,所以如果你想隐藏它,更臭的第一个版本可能会更好。

于 2013-06-13T11:53:12.047 回答