下面的代码显然不起作用,但这是我的想法。有没有办法使用item
创建类似下面两个的方法,而不重复doc.css(".main_entry").each do |item|
一遍又一遍?
class Scraper
.
.
.
doc.css(".main_entry").each do |item|
def artist
@artist ||= item.at_css(".list_artist").text
end
def title
@title ||= item.at_css(".list_album").text
end
end
.
.
.
end
puts scraper.artist
puts scraper.title
答案 0 :(得分:2)
你几乎拥有它。但是,方法范围不会嵌套,Ruby中唯一创建嵌套范围的构造是块。值得庆幸的是,有一种方法可以定义将块作为参数的方法:
class Scraper
.
.
.
doc.css(".main_entry").each do |item|
define_method(:artist) do
@artist ||= item.at_css(".list_artist").text
end
define_method(:title) do
@title ||= item.at_css(".list_album").text
end
end
.
.
.
end
puts scraper.artist
puts scraper.title
然而,请注意,这与原始代码如果有效有完全相同的问题:您只是一遍又一遍地覆盖相同的方法。