5

我希望能够在可枚举的块中产生,以便创建一些样板基准代码。

基本上我想做这样的事情(简化):

def iterator( enumerable, &block )
  iterations = enumerable.size
  counter = 0
  enumerable.each do |item|
    counter +=1
    puts "Iterating #{counter}/#{iterations}..."
    yield
  end
end

然后我希望能够使用这个方法来将这个样板基准代码包装在我要迭代的块周围,这样我就可以调用类似的东西:

# assuming foo is an enumerable collection of objects
iterator foo do
  item.slow_method
  item.mundane_method
  item.save
end

...当这段代码执行时,我会得到以下日志输出:

Iterating 1/1234...
Iterating 2/1234...
Iterating 3/1234...

似乎这种事情一定是可能的,但我一直无法弄清楚语法,也不知道这种事情叫什么(以便查找)。

问题是我需要将样板文件包装在要迭代的可枚举对象的外部,以及迭代块的内部。我可以很好地传递一个可枚举的对象,但我似乎无法从我传入的块中调用迭代对象的方法。

我希望这个解释是有道理的,我很难描述它。如果您需要澄清任何事情,请发表评论,我会尽力解释得更好。

4

1 回答 1

7

Ruby 的yield语句可以带参数。你会想说

yield item

这会将“当前”项目传递给您的“外部”块。

希望我正确理解了这个问题。

附录

这是实际显示它的代码:

class Item
  def initialize(id)
    @id = id
  end
  def slow_method()
    puts "slow #@id"
  end
  def mundane_method()
    puts "mundane #@id"
  end
  def save()
    puts "save #@id"
  end
end

foo = [Item.new(100), Item.new(200), Item.new(300)]

def iterator(enumerable, &block)
  iterations = enumerable.size
  counter = 0
  enumerable.each do |item|
    counter +=1
    puts "Iterating #{counter}/#{iterations}..."
    yield item
  end
end

iterator foo do |item|
  item.slow_method
  item.mundane_method
  item.save
end
于 2011-07-30T00:13:56.853 回答