我有很多方法,我称之为:
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
答案 0 :(得分:3)
您确实可以使用inject
创建嵌套的lambda或proc,最后可以调用它们。你需要你的给定块作为嵌套的内部,所以你反转你的数组并使用该块作为初始值,然后将每个连续函数包装在inject的结果周围:
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