0

猴子修补 Hash 以使其像这样的行为可能会产生什么影响:

class Hash
  def method_missing(method,*args, &block)
    if self.has_key?(method)
      return self[method]
    elsif self.has_key?(method.to_s)
      return self[method.to_s]
    else
      return nil
    end
  end
end

我的理由如下:

基本上,当我将对象添加到散列时,我会确保它们的 keys.to_s 是唯一的。

我应该担心,我错过了什么吗?

h = { :foo => "bar", "hello" => "bar" }

h.foo => "bar"
h.hello => "bar"
4

2 回答 2

6

为此有一个原生 ruby​​ 对象:OpenStruct

OpenStruct您可以使用哈希实例化一个。

o = OpenStruct.new(hello: 'world')

初始化后,您可以将所有键用作方法。

o.hello #=> "world"

因此,您不需要对哈希进行猴子修补(这确实会导致奇怪的行为)。

OpenStruct 在内部管理字符串和符号条目之间的重复项。

OpenStruct.new(:hello => 'world', 'hello' => 'world2') #=> #<OpenStruct hello="world2">
于 2013-07-29T15:10:06.400 回答
1

馊主意!!

如果你拼错了任何有效的 hash 方法,你将得到一个 nil 而不是真正的方法丢失。例如:{}.count => 0,{}.counts => nil 而不是 NoMethodError:{}:Hash 的未定义方法 `counts'。

于 2013-07-29T15:12:42.927 回答