2013-04-01 154 views
1

我在线查看如何构建搜索引擎的代码(下面的链接)。作为新手程序员,我很难解释循环的方式。Ruby:'next if'和'if'语句

的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 

问题:

  1. 是否退出程序的块并返回到 'urls.each' 行的开头,如果url_object是零?
  2. 此代码是否显示为:“如果我们正在查看的网址已被访问,或者已访问的网址是否为零?”
  3. 这个问题取决于我的第二个问题。如果问题#2中的一个陈述是真实的......只有在网站大小与page_limit相同的情况下,我们才应该返回唯一的next_urls。

任何建议帮助!感谢迄今为止的阅读!

链接:http://www.skorks.com/2009/07/how-to-write-a-web-crawler-in-ruby/

回答

1
  1. 事实上
  2. 它读取:设置@already_visited[url]为true,如果我们以前没有访问过这个网址
  3. 呀,只返回如果@already_visited “名单” 是同大小作为页面的限制。它实际上并没有返回任何东西,但大部分工作似乎是在实例变量@already_visited上完成的,因此不需要返回任何东西。
+0

感谢您的洞察力在第三个问题上,程序员为什么决定使用'return'?如果'@ already_visited'完成了这项工作......是否有必要返还任何东西? – andy4thehuynh

+0

在这种情况下,@leggooo'return'只是简单地打破了整个方法(因此包括突破嵌套块)。就像在“好吧,工作完成了,让我们离开这里吧。”毕竟工作被保存了。 '@ already_visited'没有执行工作,它存储在那里('@ already_visited'是一个变量,由于它的作用域而超出了crawl_web的方法;它是一个实例变量) –

+0

感谢您的澄清。由于块在它下面结束两行,是否需要使用'return'?我想了解这个约定是否可以添加到其他代码中。 – andy4thehuynh