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

时间:2013-08-23 06:48:06

标签: ruby nokogiri

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

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方法应用于零值,代码将会中断。

这是因为有时html不会有该方法正在寻找的CSS选择器。

这就是我想在那里停止代码的原因。

我必须在每种方法中重复一遍。这样做有更简单或更优雅的方式吗?

1 个答案:

答案 0 :(得分:3)

你可以写

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