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