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
4

1 回答 1

3

您确实可以使用inject创建的嵌套 lambdas 或 procs,您可以在最后调用它们。您需要给定的块是嵌套的内部,因此您反转数组并将该块用作初始值,然后将每个连续的函数包装在注入的结果周围:

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用 before 和 after 语句包装你的 , et al 方法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
于 2013-03-27T02:28:49.640 回答