【发布时间】:2016-11-10 09:49:55
【问题描述】:
可能有一种简单的方法可以做到这一点。
我正在尝试重构如下内容
def foo(baz)
baz.update_first
if baz.has_condition?
yield baz.val if block_given?
baz.a
else
baz.b
end
end
像这样称呼
foo(baz) {|b| b.modify}
类似
def foo(baz)
baz.update_first
bar(baz) {|i| yield i if block_given? }
end
def bar(baz)
if baz.has_condition?
yield baz.val if block_given?
baz.a
else
baz.b
end
end
这行得通吗?怎么样?
我认为它会,但我希望清楚地解释块内的屈服如何工作......阅读 proc.c 和 vm.c 以及 relevant git commit in the ruby source code ,我认为当 bar 在 foo 中被调用时执行直到它产生,然后你将帧堆栈向上移动到 foo 中定义的块的本地环境指针,这被调用,其中 yield 走到块 foo 被调用,执行它,然后你回到酒吧。那是对的吗?有没有更好的方法来做到这一点?
这对我来说有点奇怪,就像反转控制一样,它需要 foo 比我想要的更多地了解 baz,但不幸的是我不能简单地在这段代码中传递一个 proc 或 lambda。
【问题讨论】:
标签: ruby-on-rails ruby yield