1

每次我运行此代码(作为“google-search”gem 的示例给出)时,我的所有三个 rank_for 查询都返回为“未找到”。

想也许问题出在if item = find_item(/vision\-media\.ca/, query)我不知道他们为什么指的是 vision-media.ca 网站。

请帮忙!我真的只是在周末读了一本关于 Ruby 的书。

require "rubygems"
require "google-search"

def find_item uri, query
    search = Google::Search::Web.new do |search|
        search.query = query
        search.size = :large
        search.each_response { print "." ; $stdout.flush }
    end
        search.find { |item| item.uri =~ uri }
end

def rank_for query
    print "%35s " % query
    if item = find_item(/vision\-media\.ca/, query)
        puts " #%d" % (item.index +1)
    else
        puts " Not found"
    end
end

rank_for "hackerspace new york"
rank_for "makerspace new york"
rank_for "fab lab new york"
4

1 回答 1

3

这个例子不是很明显,因为它利用了“高级”红宝石功能。

例如:

search.each_response { print "." ; $stdout.flush }注册一个代码块,{...}当从 google 获取另一个结果页面时调用该代码块。

search.find { |item| item.uri =~ uri }是非常基本的概念,称为迭代器,但这可能是您收到“未找到”消息的情况。rank_for它检查返回的 google uri 是否与( /vision\-media\.ca/)中提供的正则表达式匹配。如果这是新的,你应该明确地阅读正则表达式。它们也广泛用于红宝石。请记住,方法中最后评估的东西将是该方法的返回值。所以find_item将返回find计算的值(uri 匹配 vision-media.ca 的所有项目)。

另一件事是输出格式print "%35s " % query。这以 sprintf 中描述的特定格式打印出查询的内容。学习它,爱它。

这就是解释概念的全部内容。

一个非常简单的实现是这样的:

require "google-search"

[
  "hackerspace new york",
  "makerspace new york",
  "fab lab new york"
].each do |query|
  puts "searching for #{query}"
  Google::Search::Web.new do |search|
    search.query = query
    search.size = :large
  end.each { |item| puts item.title }
end
于 2013-10-15T15:52:13.707 回答