gpt4 book ai didi

ruby - 在按名称接受 block 的方法调用中包装 block

转载 作者:数据小太阳 更新时间:2023-10-29 07:17:50 27 4
gpt4 key购买 nike

我有很多这样调用的方法:

with_this do
with_that do
and_in_this_context do
yield
end
end
end

我记得有一个技巧可以递归包装这样一个 block 调用。如何编写一个为我进行 block 包装的方法?

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

最佳答案

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

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

如果你用 puts 语句前后包裹你的 with_this 等方法,你可以看到这个 Action :

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

关于ruby - 在按名称接受 block 的方法调用中包装 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15650399/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com