【问题标题】:Rails Method_missing to throw back values from a hashRails Method_missing 从哈希中返回值
【发布时间】: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


【解决方案1】:

类似的东西呢:

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

【讨论】:

    【解决方案2】:

    最短的是

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

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

    【讨论】:

    • 不客气!我刚刚了解到您甚至可以不使用 args — 已更新 :)
    猜你喜欢
    • 2017-03-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2016-03-07
    • 1970-01-01
    • 2013-10-18
    相关资源
    最近更新 更多