当我在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
答案 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}}”。