2013-03-27 39 views
5

接受塊的塊我有很多的,我這樣調用方法:結束語在方法調用,通過名字

with_this do 
    with_that do 
    and_in_this_context do 
     yield 
    end 
    end 
end 

我記得有一招遞歸包裹這樣的塊調用。 我該如何編寫一個阻止我進行封裝的方法?

def in_nested_contexts(&blk) 
    contexts = [:with_this, :with_that, :and_in_this_context] 
    # ... magic probably involving inject 
end 

回答

3

你的確可以使用inject創建嵌套lambda表達式或特效,您可以在結束通話。你需要你給定塊是嵌套的內部,讓你扭轉你的數組,並使用該塊作爲初始值,然後從注入環繞結果每個連續的函數:

def in_nested_contexts(&blk) 
    [:with_this, :with_that, :and_in_this_context].reverse.inject(blk) {|block, symbol| 
    ->{ send symbol, &block } 
    }.call 
end 

如果你換你with_this ,等人之前和之後puts語句方法,你可以在行動中看到這一點:

in_nested_contexts { puts "hello, world" } 
#=> 
    with_this start 
    with_that start 
    context start 
    hello, world 
    context end 
    with_that end 
    with_this end 
+0

正是我需要的,謝謝! – Julik 2013-03-27 10:18:48

相關問題