猴子修补Ruby的Hash类

时间:2013-07-29 15:06:06

标签: ruby

猴子修补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"

2 个答案:

答案 0 :(得分:6)

有一个原生的ruby对象:OpenStruct

您可以使用哈希实例化OpenStruct

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

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

o.hello #=> "world"

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

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

OpenStruct.new(:hello => 'world', 'hello' => 'world2') #=> #<OpenStruct hello="world2">

答案 1 :(得分:1)

BAD IDEA !!

如果你拼错了任何有效的哈希方法,你将得到一个零而不是缺少真正的方法。例如:{}。count =&gt; 0,{} .counts =&gt; nil而不是NoMethodError:{}的未定义方法`counts':Hash。