gpt4 book ai didi

ruby - 在 `begin; return; ensure` 期间发生了什么?

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

我正在研究 gem 的内部结构,并遇到了以下模式:

def foo
begin
return 'foo'
ensure
puts 'bar'
end
end
foo

这会将字符串 'foo''bar' 打印到 STDOUT。这是怎么发生的?我天真的理解是,当您遇到 return 语句时,您会将调用弹出堆栈并返回 return 指定的值。我想如果是这种情况,那么您将无法执行 ensure block 。显然 ensure block 被执行了。我很好奇这是怎么发生的。这种行为是如何实现的?

最佳答案

这正是它在 MRI 中定义的方式,更具体地说是在 eval.c 中的函数 rb_ensure 中(我删掉了实际的实现,但本质上它只是生成一个 Ruby 执行上下文,在该上下文中执行 block ,然后确保所有 ensure block 一个接一个地运行:

* Equivalent to <code>begin .. ensure .. end</code>.
*
* Calls the function \a b_proc with \a data1 as the argument,
* then calls \a e_proc with \a data2 when execution terminated.
* \return The return value of \a b_proc if no exception occurred,
* or \c Qnil if otherwise.
* \sa rb_rescue
* \sa rb_rescue2
* \sa rb_protect
* \ingroup exception
*/
VALUE
rb_ensure(VALUE (*b_proc)(ANYARGS), VALUE data1, VALUE (*e_proc)(ANYARGS), VALUE data2)
{
...
}

如果您对解析器如何决定调用此派系感兴趣,请查看 parse.y,它是 bodystmt 规则的一部分。

关于ruby - 在 `begin; return; ensure` 期间发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50368389/

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