如果找不到库(通过 require 加载),我可以有条件地跳过在同一文件中加载“更多”ruby 代码吗?
begin
require 'aws-sdk'
rescue LoadError
puts "aws-sdk gem not found"
return #does not work. nor does next
end
# code after here should not be executed as `aws-sdk` gem was not found
puts "=== should not get executed"
namespace :db do
desc "import local postgres database to heroku. user and database name is hardcoded"
task :import_to_heroku => [:environment, "db:dump_for_heroku"] do
# code using aws-sdk gem
end
end
在上面的代码中,我可以要求 Ruby 在点击 rescue LoadError
.
就像提前返回,但用于加载文件而不是函数。
需要它,因为我有一个需要aws-sdk
rubygem 的 rake 任务,但我只在我的本地机器上使用它。如果aws-sdk
没有找到,我以后在同一个文件中加载代码是没有意义的。我想我可以将代码拆分为较小的文件并在 require 调用中对其进行变形
if Rails.env.development?
require 'import_to_heroku'
end
但不想扭曲或修改我现有的代码
此外,我可以将整个代码包装在一个条件中,但这并不优雅。begin-rescue 块也是一种显式控制流。我不想以任何方式包装或触摸原始代码
也许是一个 api,例如
require_or_skip_further_loading 'aws-ruby`
所以我希望我的代码在功能上等同于
begin
require 'aws-sdk'
namespace :db do
desc "import local postgres database to heroku. user and database name is hardcoded"
task :import_to_heroku => [:environment, "db:dump_for_heroku"] do
# code using aws-sdk gem
end
end
rescue LoadError
puts "aws-sdk gem not found"
end
或通过 if 条件
library_found = false
begin
require 'aws-sdk'
library_found = true
rescue LoadError
puts "aws-sdk gem not found"
return #does not work
end
if library_found
namespace :db do
desc "import local postgres database to heroku. user and database name is hardcoded"
task :import_to_heroku => [:environment, "db:dump_for_heroku"] do
# code using aws-sdk gem
end
end
end
LoadError
希望程序在引发后继续执行。IE。优雅地处理LoadError
并且不加载LoadError
在同一文件中编写的代码。cannot raise exit
or abort
onLoadError
尤其是之后的代码LoadError
不应由 ruby 解释器执行(或加载)
最初问过如何在ruby中跳过require? 但我没有正确地问这个问题。希望这个措辞更好