簡體   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