如何取消评估所需的Ruby文件?

use*_*951 10 ruby return raise exit abort

file1 需要file2,我希望能够file2在某些条件下取消评估而不退出整个过程.

# file1.rb
  puts "In file 1"
  require 'file2'
  puts "Back in file 1"

# file2.rb
  puts "In file 2"
  # return if some_conditional
  puts "Still in file 2"
Run Code Online (Sandbox Code Playgroud)

运行时file1,我想看到的输出是:

In file 1
In file 2
Back in file 1
Run Code Online (Sandbox Code Playgroud)

目标是Still in file 2永不打印,同时Back in file 1打印.我能做些什么才能做到file2这一点?

我无法使用exit/ exit!/ abort这里,因为Back in file 1永远不会打印.我可以使用raise/ fail,但为了做到这一点,我将不得不改变file1rescue失败require.我希望找到一种不涉及改变的方法file1.

更新:

A"顶级回报"的功能已经被添加.

ste*_*lag 5

以下行__END__ 不会被执行.

# file2.rb
puts "In file 2" 
__END__
puts "Still in file 2" # Never gets called
Run Code Online (Sandbox Code Playgroud)


use*_*951 4

更新

增加了“顶级返回”功能。

原来的

评论者matt指出,功能 4840自 2011 年 6 月以来一直在讨论,该功能完全符合我的要求。此外,截至 2015 年 11 月,有关 Ruby 新功能的核心团队会议仍在讨论该功能。

设计这样的功能有很多困难;对于优点和缺点的列表,我强烈建议查看讨论。

提议的功能将允许在使用以下任何顶级语句时退出所需的文件:

if condition
  return
end

while condition
  # ...
  return
end

begin
  # ...
  return
rescue
  # ...
  return
ensure
  # ...
  return
end
Run Code Online (Sandbox Code Playgroud)

并且在以下语句中不会退出所需的文件:

class Foo
  return # LocalJumpError
end

def foo
  return # returns from method, not from required file
end

proc do
  return # LocalJumpError
end

x = -> { return } # returns as from lambda, not from required file
Run Code Online (Sandbox Code Playgroud)

由于该功能仍未实现,我已向steenslag授予赏金,奖励其成功解决问题(如最初所写),即使不是精神上的。