を実行された場合にのみ実行するように
print "executed"
for文たいですブロックの外側に配置し、ブロック内から設定してからテストします。
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
私に悪臭を覚えました - 代わりにブロックを実行させる条件をテストして(第2の形式のように)、意味的にコードを書いてそのことを意味するようにします。例:
これは、この場合、一部のブロックが呼び出されたかどうかではなく、処理するargがあるかどうかを気にしていることを反映しています。ブロックに気になる副作用がある場合は、ブロック実行に基づいていると仮定するのではなく、その副作用を直接テストする必要があります。
この場合、ブロックが呼び出されたことを既に知っています。そうでなければ、LocalJumpError( "No Block Given")があります。あなたが 'yield(item)if block_given?'を使ったのであれば、それは別の話になります。 –
@maxpleaner 'yield'は' list'が空であれば呼び出されません。 – tadman
おそらく[これらのRspecテスト](https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/yield-matchers)を使用することができます。 –