[英]Optionally calling a block in ruby
我有兩種方法可能需要使用一個塊來調用一些代碼。
選項1:
foo()
選項2:
block_function do
foo()
end
如何在運行時在這兩者之間切換? 我真的不想執行以下操作,因為foo()
實際上是很多代碼:
if condition then
foo()
else
block_function do
foo()
end
end
def condition_or_block_function
if condition
yield
else
block_function { yield }
end
end
condition_or_block_function do
foo() # which is really a lot of code :)
end
或者像其他人所建議的那樣,使foo()
一堆代碼成為實際方法,並編寫您在OP中編寫的內容。
@tadman建議的更通用的版本:
def condition_or_block condition, block_method, *args
if condition
yield
else
send(block_method, *args) { yield }
end
end
condition_or_block(some_condition, some_block_yielding_method) do
foo() # which is really a lot of code :)
end
@Christian Oudard添加了說明特定問題的注釋,可以選擇使用div do ... end與Erector裝飾代碼塊。 這表明了另一種方法:
class BlockWrapper
def initialize(method=nil)
@method = method
end
def decorate
@method ? send(method) { yield } : yield
end
end
wrapper = BlockWrapper.new( condition ? nil : :div )
wrapper.decorate do
#code block
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.