每次我运行此代码(作为“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"
答案 0 :(得分:3)
这个例子不是很明显,因为它使用了“高级”ruby功能。
例如:
search.each_response { print "." ; $stdout.flush }
在{...}
中注册了一个代码块,该代码块在获取谷歌的另一个结果页面时被调用。
search.find { |item| item.uri =~ uri }
是一个非常基本的概念,称为迭代器,但可能就是你得到“Not Found”消息的情况。它检查返回的google uri是否与rank_for
(/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