【问题标题】:how can I extract out this ruby code as a method that converts a hash to variables?如何将这个 ruby​​ 代码提取为将哈希转换为变量的方法?
【发布时间】:2015-10-23 17:28:40
【问题描述】:

我有以下代码分布在一堆方法中:

json_element 作为参数传递给方法。 问题:

  • 哈希中的值发生了变化,这意味着一个可能有key,但下一次可能有search
  • 有时值是nil,所以它会爆炸。
  • 如果有值,我用来创建它的 gem 有那些元素的 ['$'],但如果你这样做,它会出错json_element['COLLECTION']['$].nil?

      json = json_element['JSON']['$'] unless json_element['JSON'].nil?
    
    
      predicate = json_element['PREDICATE']['$'] unless json_element['PREDICATE'].nil?
      key = json_element['KEY']['$'] unless json_element['KEY'].nil?
      options = json_element['OPTIONS']['$'] unless json_element['OPTIONS'].nil?
      cache_key = json_element['CACHE-KEY']['$'] unless json_element['CACHE-KEY'].nil?
    

问题:我如何才能将这整个位提取为一种允许灵活键并且在值为 nil 时不会出错的方法

【问题讨论】:

  • 你是想问如何覆盖一个方法?
  • 我想把这段代码提取为方法。

标签: ruby json methods


【解决方案1】:

我不确定我是否理解正确。如果散列中的值是nil,它不应该出错。变量将被分配nil#nil? 也不应该出错。

只需将代码重构为方法:

def process(json_element)
  return if json_element.nil?
  hash = {} # store the variables in a hash
  %w{json predicate key options cache-key}.each do |i|
    hash[i.upcase] = json_element[i.upcase]['$'] unless json_element[i.upcase].nil?
  end
end

【讨论】:

  • 它出错是因为 nil['$'] 出错了。存储实际值的 $ 元素是为什么它比常规哈希更复杂的原因。
  • 这不起作用,因为迭代的值不是静态的:e f json 谓词键等在调用之间并不总是相同。
  • 如何将要迭代的值作为参数传递?
  • 什么意思?如果为 nil 的哈希值会导致 [$] 元素出错,因为它看起来像在 nil 上应用方法
  • 您说json, predicate 等在调用之间并不相同——这些值可以作为参数传递给函数。我仍然不确定我是否理解您的 nil 案例。如果json_element 为零,方法将返回。如果json_element[key] 为 nil,则跳过该行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 2010-12-16
  • 2011-12-19
  • 1970-01-01
  • 2013-07-08
  • 2017-07-06
  • 1970-01-01
相关资源
最近更新 更多