【发布时间】:2012-04-25 11:10:21
【问题描述】:
我正在尝试编写一个 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
有没有更好的方法?
【问题讨论】:
-
改用OpenStruct 怎么样?您可以从散列初始化
OpenStruct的实例,并使用struct.attribute语法引用其属性。如果缺少该值,它将简单地返回nil,但看起来它可能对您有用。 -
@KL-7 +1 OpenStruct 恰好在下面使用了
method_missing。 -
问题是关闭了太多150个键??所以创建一个结构会做更多的工作。我将它放在演示器中,因此方法分散在整个程序中,有时会使用某些方法,有时会使用其他方法,如果我在调用缺少的方法后使用散列,则将定义该方法,然后下一个当它被调用时,它将被保存在内存中
-
@steenslag 确实可以,但它可以避免您自己动手。
-
@TheLegend 使用 OpenStruct 对您来说工作量更少,因为您只需将哈希传递给它的构造函数。顺便说一句,看起来 OpenStruct 仅在您第一次引用属性时才使用
method_missing。供以后访问它defines 成熟的 getter 和 setter。
标签: ruby-on-rails ruby method-missing