2013-03-27 19 views
5

Tôi có một số phương pháp mà tôi gọi là như thế này:Việc đóng gói một khối trong các cuộc gọi phương pháp mà chấp nhận khối theo tên

with_this do 
    with_that do 
    and_in_this_context do 
     yield 
    end 
    end 
end 

Tôi nhớ có một thủ thuật để đệ quy quấn như một cuộc gọi khối. Làm cách nào để viết một phương thức chặn gói cho tôi?

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

Trả lời

3

Bạn thực sự có thể sử dụng inject để lambdas lồng nhau tạo ra hoặc procs, mà bạn có thể gọi ở cuối. Bạn cần block cho bạn được phần bên trong của tổ, vì vậy bạn đảo ngược mảng của bạn và sử dụng khối như các giá trị ban đầu, sau đó quấn mỗi chức năng liên tiếp xung quanh kết quả từ bơm:

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

Nếu bạn quấn with_this của bạn , et al phương pháp với trước và sau puts báo cáo, bạn có thể thấy điều này trong hành động:

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

Chỉ cần những gì tôi cần, cảm ơn! – Julik

Các vấn đề liên quan