每当我将块传递给Ruby中的yield方法时,我想知道块是否实际执行过。例如:
def yield_method(list)
list.each do |item|
yield item
end
end
yield_method(ARGV) { |item|
print item
}
print "executed"
我想要
print "executed"
语句仅在传递给yield方法的块执行时运行
答案 0 :(得分:3)
您需要在块外部初始化变量,然后在块中设置它,然后测试它。
executed = false
yield_method(ARGV) do |item|
executed = true
# whatever else
end
print "executed" if executed
或者您可以修改yield_method
以根据是否满足要执行的块的条件返回值:
def yield_method(list)
list.each do |item|
yield item
end
list.any?
end
executed = yield_method(ARGV) { ... }
print "executed" if executed
那就是说,需要知道块是否被执行对我来说闻起来很糟糕 - 我会让你的测试测试条件允许块执行(如第二种形式),并写下你的代码在语义上反映出来。例如:
def process_argv(list)
list.each do |item|
yield item
end
list.length
end
args_processed = process_argv(ARGV) { ... }
print "executed" if args_processed > 0
这反映出在这种情况下,您关心是否存在要处理的args,而不是是否某些块最终被调用。如果该块具有您关心的副作用,则应直接测试该副作用,而不是基于块执行来假设它。