我希望能够在一个可枚举的块中产生,以便创建一些样板基准测试代码。
基本上我想做一些事情(简化):
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...
似乎这种事情一定是可能的,但是我无法弄清楚语法,也不知道这样的事情是什么(为了查找它)。
问题是我需要将样板包装在OUTSIDE的可枚举对象中,并且还要迭代迭代块。我可以很好地传递一个可枚举的对象,但我似乎无法从我传入的块中调用迭代对象上的方法。
我希望这种解释有意义,我很难描述它。如果您需要澄清任何内容,请留下评论,我会尝试更好地解释。
答案 0 :(得分: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