【问题标题】:iterate over an array and delete elements conditionally遍历数组并有条件地删除元素
【发布时间】:2013-01-04 15:11:13
【问题描述】:

我想遍历一个 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

有人想要更清洁的解决方案吗?

【问题讨论】:

  • codereview.stackexchange.com 可能是这个问题的更好的地方。

标签: ruby exception-handling


【解决方案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

【讨论】:

    【解决方案2】:

    一切似乎都是合理的,除了循环中的break。我也喜欢溶液的清洁度。

    【讨论】:

    • 没错,讨厌那里的突破,这就是为什么发布它 - 也许有人对如何实现这个清洁器有更好的想法。
    • @EmilPetkov 为什么需要休息?
    • 如果 URL 有效,则不应将其删除,并应继续处理块外。没有中断将继续对所有 URL 进行请求。顺便提一句。 "true" 可以去掉 :)
    • @EmilPetkov 也许我不明白你的想法:你需要看看是否有任何 url 工作并开始使用第一个工作,是吗?
    • 是的,当第一个作品时应该使用它,就是这样。另一方面,如果超时,则应从列表中删除 URL。如果从列表中删除了一个 URL,我们应该继续下一个,依此类推。
    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多