在Ruby中迭代中创建方法?

时间:2014-10-05 21:29:30

标签: ruby

下面的代码显然不起作用,但这是我的想法。有没有办法使用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

1 个答案:

答案 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

然而,请注意,这与原始代码如果有效有完全相同的问题:您只是一遍又一遍地覆盖相同的方法。