繁体   English   中英

Ruby跳过列表任务中的项目

[英]Ruby skips items from list tasks

我正在尝试制作一个应用程序,如果该应用程序提供键入的选项,则键入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"

正如我做我最好的假后,显示输入的代码做跳跃列表中的某些项目,但它也从来没有为其它项目执行代码,因为它应该,因为它是each循环

首先,我认为也许continue是错误的,但是正如您从输出中看到的,continue是真实的,这使我想知道为什么ruby会跳过我的代码?

更新这是to_bool方法的来源:

class String

    def to_bool()
        return true if self == "true"
        return false if self == "false"
        return nil
    end
end

在您最后的救援声明中添加:

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

并检查输出。 您的代码很可能引发除“请undefined method to_bool for true:TrueClass请”以外的异常(我希望undefined method to_bool for true:TrueClass )。 注意,使用异常跳过循环元素是一个可怕的主意。 您为什么不能摆脱这种营救而做:

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

此代码中有很多东西,使其非常不像红宝石。 如果要改进它,请将其粘贴到StackExchange CodeReview页面。 (评论中的链接)。

更新:

不好意思,您处于嵌套循环中,因此if语句将不起作用。 您可能会看到与提高/救援位类似的东西,即throw / catch,请参见此处的示例: 如何从Ruby中的嵌套循环中打破? 我仍然认为您应该将其发布到codereview中,以获取重构建议。

至于您的实际代码(无需重构)。 您正在继续上调用to_bool方法,并在您的救援块中分配true而不是'true' 因此,您的to_bool方法会引发异常,然后以与“ no more please”异常相同的方式进行挽救。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM