一种在变量为nil时停止代码的简单/更优雅的方法



我使用以下代码来废弃站点中的部分:

class Parser
  def self.parse(html)
    @data = Nokogiri.HTML(open(html))
    merged_hashes = {}
    array_of_hashes = [
      parse_department,
      parse_super_saver,
      parse_new_arrivals,
      parse_out_of_stock,
      parse_categories,
      parse_results,
      parse_category
    ]
    array_of_hashes.inject(merged_hashes,:update)
    return merged_hashes
  end
  .
  .
  .
  def self.parse_results
    results = @data.css('#refinements ul').first
    unless results
      @results_hash = {}
      return @results_hash
    end
    if results.css('li:nth-child(1) a span').text == "Pet Supplies"
      @results_hash = {}
      @results_hash[:results] ||= {}
      @results_hash[:results] = @data.at_css('#resultCount span').text[/(S+) Results$/i, 1].delete(",").to_i
    else
      @results_hash = {}
    end
    return @results_hash
  end

正如你在这部分看到的:

    results = @data.css('#refinements ul').first
    unless results
      @results_hash = {}
      return @results_hash
    end

如果resultsnil,我将停止代码。原因是,如果将下面的.at_css方法应用于nil值,则代码将中断。

发生这种情况是因为有时html没有该方法要查找的CSS选择器。

这就是为什么我想停止那里的代码。

我必须在每种方法中重复这一点。有没有更简单或更优雅的方法?

您可以直接编写

return {} if results.nil?

不过,我确实有一些建议:

  • 你真的需要设置@results_hash吗?因为我认为它根本不应该是一个实例变量。无论如何,您使用的是类方法(def self.parse_results)。

  • 为什么需要将结果嵌套在@results_hash[:results]中?在我看来,直接填写results_hash就足够了。这样,您就可以用一个空散列初始化results_hash变量一次

  • @results_hash[:results] ||= {}行实际上是多余的,因为无论如何,您都会在下一行中立即覆盖该值。

  • Ruby隐式返回最后一个表达式的值,因此可以删除最后一个return。尽管人们需要习惯这种表示法,但它的使用是广泛的,通常被认为是"好风格"

也就是说,我会这样写方法:

def self.parse_results
  results_hash = {}
  results = @data.css('#refinements ul').first
  return results_hash if results.nil?
  if results.css('li:nth-child(1) a span').text == "Pet Supplies"
    results_hash = @data.at_css('#resultCount span')
                        .text[/(S+) Results$/i, 1]
                        .delete(",")
                        .to_i
  end
  results_hash
end

相关内容

  • 没有找到相关文章