1
Je regarde ce code en ligne sur la façon de construire un moteur de recherche (lien ci-dessous). En tant que programmeur novice, j'ai eu du mal à interpréter la façon dont les boucles.Ruby: instructions 'next if' et 'if'
code Ruby:
def crawl_web(urls, depth=2, page_limit = 100)
depth.times do
next_urls = []
urls.each do |url|
url_object = open_url(url)
next if url_object == nil # [1]
url = update_url_if_redirected(url, url_object)
parsed_url = parse_url(url_object)
next if parsed_url == nil
@already_visited[url]=true if @already_visited[url] == nil # [2]
return if @already_visited.size == page_limit # [3]
next_urls += (find_urls_on_page(parsed_url, url)[email protected]_visited.keys)
next_urls.uniq!
end
urls = next_urls
end
end
Questions:
- Est-ce que la sortie du programme du bloc et revenir au début de la ligne 'urls.each' si le url_object est nul ?
- Est-ce que ce code lit: "Si l'URL que nous regardons a été visitée OU si l'URL déjà visitée est nulle?"
- Cette question dépend de ma deuxième question. Si l'une des affirmations de la question # 2 est vraie ... nous ne devrions retourner des next_urls uniques que si la taille du site est la même que la page_limit.
Un conseil utile! Merci d'avoir lu jusqu'ici!
Lien:http://www.skorks.com/2009/07/how-to-write-a-web-crawler-in-ruby/
Merci pour la perspicacité Sur ma troisième question, pourquoi le programmeur a-t-il décidé d'utiliser 'return'? Si le '@ already_visited' a fait le travail ... est-il nécessaire de retourner quelque chose? – andy4thehuynh
@leggooo 'return' dans ce contexte est simplement de sortir de la méthode entière (par conséquent, y compris la rupture des blocs imbriqués). Comme dans, "ok, le travail est fait, sortons d'ici." Le travail après tout est sauvé. '@ already_visited' n'a pas _do_ le travail, il est stocké là (' @ already_visited' est une variable qui survit à la méthode 'crawl_web' en raison de sa portée, c'est une variable d'instance) –
Merci pour la clarification. Puisque le bloc se termine deux lignes plus bas, est-il nécessaire d'utiliser 'return'? J'essaie de comprendre si cette convention est quelque chose que je peux ajouter à un autre code. – andy4thehuynh