gpt4 book ai didi

ruby - 主环境`return`

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

当我在 irb 或 pry 的主环境中运行以下命令时,

return "foo"

我得到:

LocalJumpError: unexpected return

这是预期的。但是当我在一个单独的文件 foo.rb 中编写这段代码时,并执行:

$ ruby foo.rb

在控制台中,它终止且没有任何错误消息。

后一种情况发生了什么?

我认为引发的错误可能会被静默处理,并在单独的文件中尝试了以下操作:

begin
return "foo"
rescue Exception => e
p e
end

并从控制台执行它,但这也没有导致错误。

当我将代码放在模块等环境中时,它返回错误:

module A
return "foo" # >> Invalid return in class/module body
end

最佳答案

顶级返回作为 ruby​​ 2.4.0 中的一个特性添加:https://bugs.ruby-lang.org/issues/4840

它从未在 release announcement 中提及, 但您可以在更详细的 news post 中的“语言更改”下看到它.

如果您运行一个包含 return "foo" 的文件在 ruby 版本中 < 2.4.0 ,您确实会看到如下错误:

foo.rb:1:in `<main>': unexpected return (LocalJumpError)

预期用例(正如您从上面的链接中看到的那样)是用于“取消 require” - 例如如果文件是特定于平台的,例如:

require "test/unit"

return unless /mswin|cygwin|mingw|bccwin/

# ...

对提议的语法和行为进行了很多讨论和辩论;但是通过阅读实现的 test cases 或许可以最好地理解所选择的实现:

def test_return_toplevel
feature4840 = '[ruby-core:36785] [Feature #4840]'
code = <<~'CODE'
return; raise
begin return; rescue SystemExit; exit false; end
begin return; ensure exit false; end
begin ensure return; end
begin raise; ensure; return; end
begin raise; rescue; return; end
return false; raise
return 1; raise
CODE
all_assertions(feature4840) do |a|
code.each_line do |s|
s.chomp!
a.for(s) {assert_ruby_status([], s)}
end
end
end

自写作return在类似 pry 的 REPL 中不在“顶层”,这导致 LocalJumpError而不是上述“顶级 return”的特殊行为。

关于ruby - 主环境`return`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55708459/

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