2013-11-03 135 views
0

如何重寫這個填充@subcategories_urls_array,就像「Fibonacci sequence in Ruby (recursion)」。Ruby方法遞歸?

我是否使用條件來檢查是否沒有更多的'.group_title' CSS選擇器來停止遞歸,或者是否可以使用計數週期的標誌變量來完成?

def main 
=begin 
=end 
    @job_section_url = find_job_section_url() 
    write_header_to_file() 
    @groups_urls_array = describe_groups(@job_section_url) 
    @subcategories_urls_array = Array.new 
    @groups_urls_array.each do |group_url| 
    @subcategories_urls_array << describe_groups(group_url) 
    end #each 
    @subcategories_urls_array.flatten! 

end #main 

def describe_groups(job_section_url) 
=begin 
Parse a page into an array of groups URLs. 
=end 
    # @looking_for_a_job_string = '%D0%98%D1%89%D1%83+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83' 
    @groups_urls_array = Array.new 
    @page = open(job_section_url, 'Cookie' => 'city=3') 
    @doc = Nokogiri::HTML(@page) 
    @nodeset = @doc.css('.group_title')[0..-2] 
    @nodeset.each do |a| 
    @group_url = CGI.escape(a['href']).gsub('%2F', '/') 
    @group_url = URI.join(DOMAIN_URL, @group_url).to_s 
    @groups_urls_array << @group_url 
    end #each 

    @groups_urls_array 
end #describe_groups 

我真的需要這個來實現嗎?

+0

你應該描述你正在努力完成什麼,你的輸入數據是什麼,以及你想要的結果。 – Phrogz

+0

在http://codereview.stackexchange.com上應詢問如何重寫某些內容的問題。 –

回答

1

我會做這樣的:

def main 

    @job_section_url = find_job_section_url() 

    write_header_to_file() 

    groups_urls_array = describe_groups(@job_section_url) 

    subcategories_urls_array = [] 

    groups_urls_array.each do |group_url| 
    subcategories_urls_array << describe_groups(group_url) 
    end 

    subcategories_urls_array.flatten 

end 

# Parse a page into an array of groups URLs. 
def describe_groups(job_section_url) 

    # @looking_for_a_job_string = '%D0%98%D1%89%D1%83+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83' 
    doc = Nokogiri::HTML(open(job_section_url, 'Cookie' => 'city=3')) 

    doc.css('.group_title')[0..-2].map { |a| 
    URI.join(
     DOMAIN_URL, 
     CGI.escape(a['href']).gsub('%2F', '/') 
    ).to_s 
    } 

end 

這裏有兩點需要注意:

  • main是一個方法名稱,一個糟糕的選擇。這不是C,所以使用描述性和助記符。
  • 在方法定義之前註釋您的代碼,而不是使用=being/=end。 Rdoc將查找並解析體面文檔中的主要評論。使用#是慣用的Ruby,雖然支持,但很少使用,實際上它大多隻在這樣的討論中使用。
  • 使用更多的空白。它是免費的,不會減慢應用程序的運行速度,並且讓您的大腦隨着時間的推移閱讀變得更容易。
  • 使用[]初始化空數組,同樣使用{}作爲散列。它們更短,除了使用塊表格之外,您會比Array.newHash.new更頻繁地看到它們。
  • subcategories_urls_array.flatten返回扁平數組。 flatten!返回nil如果沒有子陣列存在,這可能不是你想要的,並且很可能是一個錯誤。
  • describe_groups我通過刪除沒有做任何有用的中間變量來幹代碼。
  • doc.css('.group_title')[0..-2].map將返回一個數組,讓您不必將元素推送到數組並返回它。因爲這是方法中發生的最後一件事情,Ruby會自動使用返回的值作爲方法的返回值。
+0

感謝您的回答。 – user1667218

+0

感謝您的DRY實施。這就是我需要的。 – user1667218