一种简单/更优雅的方式来在变量为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隐式返回last表达式的值,因此您可以删除last 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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

寻找一种更优雅的方式来解决此任务

有没有一种更优雅的方式来代替编写大量查询?

此python装饰器的一种更优雅的方式

是否有一种更优雅的方式来使用“ while循环”而不必先在“ while循环”之外定义变量?

为继承的类寻求一种优雅的方式来拥有“ StateName”属性

一种更优雅的方式来处理同一servlet中的不同请求

寻找一种优雅的方式来解析整数

appsScript一种优雅的方式来循环范围

是否有一种更优雅的解决方案来填充地图中的列表?

一种更优雅的方法来实现基本的Groovy

是否有一种更优雅的方式来读取然后使用node js流写入*同一文件*

我可以使用一种更优雅/更优化的方法来制作此连接算法吗?

有没有一种优雅的方式可以同时检查nil和分配给变量。

DDD:在更新聚合根目录时,是否存在一种优雅的方式来传递审核信息?

在 JavaScript 中是否有一种简单的方法来检查变量是否为数字?

我可以用一种更优雅的方式对一个组件执行多项操作吗?

更优雅的代码编写方式

寻找一种更优雅的方法来通过表达式将MethodInfo转换为Func

一种使用绑定到多个组元素的数据来绑定新元素的更优雅的方法

有没有一种更优雅的方式在Ruby中编写不知道数组大小的while循环?

寻找一种更优雅的方式在类属性上执行自定义获取/设置功能

一种更实用的方式来编写此代码?

在将组件的模板加载到Aurelia中之后,是否有一种优雅的方式来运行一些代码?

是否有一种优雅的方式来呈现两组猫鼬文档?

Java:寻找一种优雅的方式来分割字符串

有没有一种优雅的Python方式来计数已处理数据?

有没有一种优雅的方式来定义关系?

Vue.js 是否有一种优雅的方式来循环 axios 中的地图键?

是否有一种优雅(或更高效)的方式来(不)迭代 C# 枚举?