Ruby从列表任务中跳过项目

时间:2014-04-02 17:08:08

标签: ruby list loops each

我正在尝试创建一个应用程序,如果提供键入选项,则键入false然后它会从列表中跳过某个元素并跳转到下一个执行相同任务的元素。

这是以下代码的基本思想:

string["items"].each do |item|
  p continue.to_s + "<- item"

  begin 
    Anemone.crawl("http://" + item["displayLink"] + "/") do |anemone|                   
      anemone.on_every_page do |page|                           
        if continue.chomp.to_bool == false
          raise "no more please"
        end
        request = Typhoeus::Request.new(page.url, followlocation: true)
        response = request.run
        email = /[-0-9a-zA-Z.+_]+@[-0-9a-zA-Z.+_]+\.[a-zA-Z]{2,4}/.match(response.body)
        if email.nil?
        else
          p email
          begin
            continue = Timeout::timeout(2) do
              p "insert now false/nothing"
              gets
            end
          rescue Timeout::Error
            continue = "true"
          end
        end                 
      end                   
    end                 
    rescue
      continue = true
      next                  
    end         
    p "---------------------------------------------------------"
end

如代码所示,如​​果用户在提示时键入false,则应该跳过该项并转到下一个项。但它的作用是:当用户键入false时,应用程序会跳过当前项目,然后不执行除打印(第二行代码)之外的所有其他项目应执行的任何代码;

输出如下:

$ruby main.rb
"1"
"true<- item"
#<MatchData "support@keycreative.com">
"insert now false/nothing"
false
"true<- item"
"true<- item"
"true<- item"

由于我在输入false之后尽力展示,但代码确实会跳过列表中的某个项目,但它也永远不会执行其他项目的代码,因为它应该是{{1} } loop

首先我认为也许继续是假的,但是你可以从输出中看到continue是真的,这让我想知道为什么ruby会跳过我的代码?

更新 这是to_bool方法的来源:

each

1 个答案:

答案 0 :(得分:0)

在上一次救援声明中添加:

rescue => e
  puts e.message
  continue = true
  next                  
end

并检查输出。很可能你的代码抛出的异常不是“不再请”(我希望undefined method to_bool for true:TrueClass)。请注意,使用异常跳过循环元素是一个可怕的想法。为什么你不能摆脱这种救援并做到:

if continue.chomp.to_bool == false
  continue = true
  next
end

这段代码中有很多东西让它非常像红宝石一样。如果您想改进它,请将其粘贴到StackExchange CodeReview页面。 (评论中的链接)。

更新:

我的坏,你是嵌套循环,所以if语句不起作用。你可能会看起来类似于raise / rescue位,即throw / catch,参见这里的示例:How to break from nested loops in Ruby?。我仍然认为你应该将它发布到codereview,但需要重构建议。

关于你的实际代码(没有重构)。您在继续调用to_bool方法,并在救援区中指定true而不是'true'。因此,您的to_bool方法会引发异常,然后以“不再请”异常的方式获救。