Рубин: Как написать "СУХОЙ" / динамический / гибкий древовидный цикл структуры - PullRequest
2 голосов
/ 01 ноября 2011

Я ищу лучший способ решения следующей проблемы структуры / логики в Ruby:

Необходимо полностью отсканировать веб-сайт, собирая заголовок каждой страницы.

Но:

  • Древовидная структура сайта неизвестна (сколько «уровней», «веток» и т. Д.)
  • Код должен быть "СУХИМ" (= "Не повторяйся")

Следующий (упрощенный) пример, конечно, был бы совершенно глупым:

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

Так как бы вы достигли этого гибко и эффективно, "СУХО"?

Большое спасибо!

Tom

1 Ответ

2 голосов
/ 01 ноября 2011

Рекурсия - твой друг:

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
...