【问题标题】:Ruby: 'next if' and 'if' statementsRuby:'next if' 和 'if' 语句
【发布时间】:2013-03-22 03:18:17
【问题描述】:

我正在在线查看有关如何构建搜索引擎的代码(下面的链接)。作为一个新手程序员,我很难理解循环的方式。

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)-@already_visited.keys)
      next_urls.uniq!
    end
    urls = next_urls
  end
end

问题:

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

任何建议都有帮助!感谢您到目前为止的阅读!

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

【问题讨论】:

    标签: ruby url loops syntax


    【解决方案1】:
    1. 确实
    2. 内容为:如果我们之前没有访问过此 url,请将 @already_visited[url] 设置为 true
    3. 是的,只有当@already_visited“列表”的大小与页面的限制相同时才返回。但它实际上并没有返回任何东西,大部分工作似乎都是在实例变量@already_visited 上完成的,所以不需要返回任何东西。

    【讨论】:

    • 感谢您的见解 关于我的第三个问题,为什么程序员决定使用'return'?如果@already_visited 完成了工作......是否有必要返回任何东西?
    • @leggooo return 在这种情况下只是打破整个方法(因此包括打破嵌套块)。比如,“好吧,工作完成了,让我们离开这里吧。”毕竟工作被保存了。 @already_visited 没有这项工作,它被存储在那里(@already_visited 是一个变量,由于其作用域,它比方法 crawl_web 的寿命更长;它是一个实例变量)
    • 感谢您的澄清。由于块在其下方两行结束,是否有必要使用return?我试图了解这个约定是否可以添加到其他代码中。
    • @leggooo 如果算法/程序的状态不再有包含块的未来迭代,则没有必要返回。希望这听起来不会太神秘。基本上,如果基于程序的状态不会有更多的迭代,那么是的,没有必要返回。 return 在你不关心程序的状态是什么的情况下很有用,你知道你已经完成了,只是想离开那里,也许可以节省几个周期
    • 假设在crawl_web() 中传递了更多要查看的url 迭代,那么使用return 是否有意义?
    猜你喜欢
    • 2012-03-23
    • 2017-11-14
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多