2011-11-01 13 views
2

我找實現在紅寶石下面的結構/邏輯問題的最佳途徑:紅寶石:如何寫一個「幹」 /動態/靈活的樹狀環結構

一個網站需要完全爬,收集每一頁的標題。

但是:

  • 該網站的樹形結構是不知道(有多少「水平」,「分支機構」等)
  • 的代碼應該是「幹」(=「不要重複自己「)

以下(簡體)例子當然是完全愚蠢:

url = some_root_url 
@title_collection = Array.new 

go_to_page(url) 
@title_collection << find_all_titles_on_page 
urls = find_all_urls_on_page 

urls.each do |url| 
    go_to_page(url) 
    @title_collection << find_all_titles_on_page 
    urls = find_all_urls_on_page 

    urls.each do |url| 
     go_to_page(url) 
     @title_collection << find_all_titles_on_page 
     urls = find_all_urls_on_page 

     urls.each do |url| 
      go_to_page(url) 
      @title_collection << find_all_titles_on_page 
      urls = find_all_urls_on_page 

      urls.each do |url| 
       go_to_page(url) 
       @title_collection << find_all_titles_on_page 
       urls = find_all_urls_on_page 

       urls.each do |url| 
        go_to_page(url) 
        @title_collection << find_all_titles_on_page 
        urls = find_all_urls_on_page 

        [...] 
       end 
      end 
     end 
    end 
end 

那麼如何以「幹」的方式靈活高效地完成這項工作?

非常感謝!

湯姆

回答

2

遞歸是您的朋友:

def walk_tree(url) 
    go_to_page(url) 
    title_collection << find_all_titles_on_page 
    urls = find_all_urls_on_page 

    urls.each do |child_url| 
    title_collection << walk_tree(child_url) 
    end 

    title_collection 
end 
+0

大 - 非常感謝! – TomDogg

+0

還有一件事:如果我沒有弄錯,變量'urls'將在每個子循環中重新初始化,從而從其父循環中刪除'urls'。在這種情況下,必須有一種機制,使每個子循環的'urls'變量都是唯一的,即包含當前級別和當前分支的數量,如:urls_1_1,urls_1_2,urls_1_3/urls_2_1,urls_2_2 ,urls_2_3/etc,對吧? – TomDogg

+0

url對於walk_tree的範圍是獨一無二的,也就是說每次調用都會重新初始化它。 –