2009-07-29 81 views
4

想象一下,我有一些資源對象的run方法,該方法在爲該資源保存的鎖下執行block參數。例如,像這樣:紅寶石塊的動態嵌套

r = Resource("/tmp/foo") 
r.run { ... } 

我如何寫一個Ruby方法,這需要一系列資源,並執行其塊參數的所有資源持有鎖下,如:

def using_resources(*res, &block) 
    r[0].run do; r[1].run do; r[2].run do ... 

    yield; 

    end; end; end; ... 
end 

是它可能呢?

回答

8

在我看來,這是最好的使用遞歸

這裏做的是代碼:

def using_resources(*res, &block) 

    first_resource = res.shift 

    if res.length > 0 
    first_resource.run do 
     using_resources(*res, &block) 
    end 
    else 
    first_resource.run do 
     block.call 
    end 
    end 

end 

並使用它像這樣:

using_resources Resource.new('/tmp'), Resource.new('http://stackoverflow.com') do 
    do_some_processing 
end 

你說,「這需要一系列資源。「如果你有一個Array已經和需要使用它,您可以圖示的Array外呼:

using_resources *my_array do 
    do_some_processing 
end 

或者方法的定義,它允許你要麼被ArrayResource列表調用它裏面S:

def using_resources(*res, &block) 
    res = [*res] 
    # rest as above 
end 
6

你也可以做到這一點使用#inject

def using_resources(*resources, &block) 
    (resources.inject(block){ |inner,resource| proc { resource.run(&inner) } })[] 
end 

正如你一步THR儘管數組中,您將每個資源的前一個Proc的調用包裝在一個新的Proc中,然後將其傳遞給下一個資源。這取得鎖倒序(最後給出的資源是第一個解鎖),但可以改變使用resources.reverse.inject ...