我有兩種方法可能需要使用塊調用某些代碼。可選地調用紅寶石塊
選項1:
foo()
選項2:
block_function do
foo()
end
如何將其中的兩個之間在運行時切換?我真的不希望做到以下幾點,因爲foo()
實際上是一大堆代碼:
if condition then
foo()
else
block_function do
foo()
end
end
我有兩種方法可能需要使用塊調用某些代碼。可選地調用紅寶石塊
選項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代碼塊做...結束與架橋機。這提示了另一種方法:
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
因此,將大量代碼移入其自己的方法中,以便您勾畫的選項不會令人難以接受? –
或者如果foo使用一堆局部變量,則可以將foo定義爲lambda。 – gmalette
'block_function'是什麼?或者你想打開帶有和沒有阻止的'foo'?你可以使用'block_given?'來檢查一個塊是否被賦予'foo'。 (如果是這樣的話,我可以發表更詳細的答案 – knut