我正在尝试编写一个method_missing方法,这样当我运行一个方法时,它必须点击哈希并查看键,如果它找到匹配以返回值。并继续。哈希是从我写的sql查询填充的,所以值永远不会是常量。
一个例子就像
@month_id.number_of_white_envelopes_made
在哈希
中 @data_hash[number_of_white_envelopes_made] => 1
所以@month_id将返回1.我以前从未使用过它,没有多少材料使用哈希作为后退而缺少方法
编辑:抱歉,我忘了说如果它没有在哈希中找到方法那么它可以继续下去没有方法错误编辑:好吧,所以我在偷偷摸摸,这就是我想出来的
def method_missing(method)
if @data_hash.has_key? method.to_sym
return @data_hash[method]
else
super
end
end
有更好的方法吗?
答案 0 :(得分:6)
如下:
def method_missing(method_sym, *arguments, &block)
if @data_hash.include? method_sym
@data_hash[method_sym]
else
super
end
end
并且始终记得添加相应的respond_to?对你的对象:
def respond_to?(method_sym, include_private = false)
if @data_hash.include? method_sym
true
else
super
end
end
答案 1 :(得分:1)
最短的是
class Hash
def method_missing(sym,*)
fetch(sym){fetch(sym.to_s){super}}
end
end
首先尝试hash[:key]
然后hash["key"]