在主要环境中“返回”

时间:2019-04-16 12:43:35

标签: ruby return main

当我在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

1 个答案:

答案 0 :(得分:3)

在ruby 2.4.0中添加了顶级返回功能:https://bugs.ruby-lang.org/issues/4840

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

如果您运行的文件包含红宝石版本input0.onblur = function () { _layout.viewHeaderTextInput.inputOnBlurHandler(canvasObj, jqHeaderText, jqInput); }; inputOnBlurHandler: function (canvasObj, jqHeaderText, jqInput) { // Hide input textbox jqInput.hide(); // Store the value in the canvas canvasObj.headingText = jqInput.val(); _layout.updateCanvasControlProperty(canvasObj.instanceid, "Title", canvasObj.headingText, canvasObj.headingText); // Show header element jqHeaderText.show(); _layout.$propertiesContent.find(".propertyGridEditWrapper").filter(function () { return $(this).data("propertyName") === "Title"; }).find("input[type=text]").val(canvasObj.headingText); // Update the property grid title input element } 中的var thisTitle = input0; var activeElement = $(document.activeElement); if (thisTitle != activeElement) { jqInput.hide(); _layout.viewHeaderTextInput.inputOnBlurHandler(canvasObj, jqHeaderText, jqInput); } ,您确实会看到类似以下的错误:

<div class="panel-header-c">
        <div class="panel-header-wrapper">
            <div class="panel-header-text" style="display: none;">(Enter View Title)</div><input class="inline-editable" type="text" style="display: block;"><div class="panel-header-controls">
                <a href="javascript:;" class="collapse-vertical" tabindex="0"><span></span></a>
            </div>
        </div>
</div>

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

< 2.4.0

关于提议的语法和行为,有很多讨论和辩论;但是也许可以通过阅读实现的test cases来最好地理解所选的实现:

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

由于在require之类的REPL中写入require "test/unit" return unless /mswin|cygwin|mingw|bccwin/ # ... 不在“顶层”,因此这会产生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 而不是上面的“顶层{{ 1}}”。