2013-04-01 5 views
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:

  1. 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 ?
  2. 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?"
  3. 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/

Répondre

1
  1. En effet
  2. Il se lit comme suit: Set @already_visited[url] true si nous avons déjà pas visité cette URL
  3. Oui, le retour que si la "liste" @already_visited est le même taille comme limite de la page. Il ne retourne cependant rien, la plupart du travail semble être fait sur la variable d'instance @already_visited, donc rien ne doit être retourné.
+0

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

+0

@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) –

+0

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