迭代数组并有条件地删除元素

时间:2013-01-04 15:11:13

标签: ruby exception-handling

我想迭代一个URL数组,如果给定URL的HTTP请求超时,则从中删除元素。它已按以下方式实施:

@urls.delete_if do |url|
  begin
    doc = perform_request(some_params)
    break
  rescue TimeoutError
    Rails.logger.warn("URL #{url} times out, will be removed from list")
    true
  end
end

任何人都能获得更清洁的解决方案吗?

2 个答案:

答案 0 :(得分:1)

除了超时之外,还有很多事情可能出错,最好是肯定而不是否定。也就是说,网站是否以我想要的方式响应,而不是网站没有以我想要的方式响应。

此外,我鼓励实践不变性,即不改变您的数据,而是从旧版本创建新版本。我的版本看起来像:

@urls = %w[www.google.com www.example.com]
valid_urls = @urls.select{ |url| up?(url)} #=> [www.google.com]

def up?(url)
  Net::HTTP.new(url).head('/').kind_of? Net::HTTPOK
end

答案 1 :(得分:0)

除了循环中的break之外,一切似乎都是合理的。我也喜欢解决方案的清洁。