0

我正在尝试编写一个 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

有没有更好的办法?

4

2 回答 2

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
于 2012-04-25T11:23:43.537 回答
2

最短的是

class Hash
  def method_missing(sym,*)
    fetch(sym){fetch(sym.to_s){super}}
  end
end

首先尝试hash[:key]然后hash["key"]

于 2013-03-05T09:18:21.687 回答