2012-05-15 62 views
0

我有兩種方法可能需要使用塊調用某些代碼。可選地調用紅寶石塊

選項1:

foo() 

選項2:

block_function do 
    foo() 
end 

如何將其中的兩個之間在運行時切換?我真的不希望做到以下幾點,因爲foo()實際上是一大堆代碼:

if condition then 
    foo() 
else 
    block_function do 
     foo() 
    end 
end 
+4

因此,將大量代碼移入其自己的方法中,以便您勾畫的選項不會令人難以接受? –

+0

或者如果foo使用一堆局部變量,則可以將foo定義爲lambda。 – gmalette

+0

'block_function'是什麼?或者你想打開帶有和沒有阻止的'foo'?你可以使用'block_given?'來檢查一個塊是否被賦予'foo'。 (如果是這樣的話,我可以發表更詳細的答案 – knut

回答

1
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 
+0

這可以通用化,以便在需要時調用方法名稱。 – tadman

+0

@tadman好建議 – dbenhur