我有一个rake任务,在开始时我做了一些检查,如果其中一个检查失败,我想从rake任务中提前返回,我不想执行任何剩余的代码。
我认为解决方案是在我想从代码返回的地方放置一个返回,但我得到以下错误
unexpected return
我有一个rake任务,在开始时我做了一些检查,如果其中一个检查失败,我想从rake任务中提前返回,我不想执行任何剩余的代码。
我认为解决方案是在我想从代码返回的地方放置一个返回,但我得到以下错误
unexpected return
当前回答
Rake任务基本上是一个块。块(lambdas除外)不支持return,但可以使用next跳到下一个语句,它在rake任务中与在方法中使用return具有相同的效果。
task :foo do
puts "printed"
next
puts "never printed"
end
或者您可以移动方法中的代码并在方法中使用return。
task :foo do
do_something
end
def do_something
puts "startd"
return
puts "end"
end
我更喜欢第二种选择。
其他回答
如果需要跳出多个块级别,可以使用fail。
例如
task :something do
[1,2,3].each do |i|
...
fail "some error" if ...
end
end
(参见https://stackoverflow.com/a/3753955/11543)。
Rake任务基本上是一个块。块(lambdas除外)不支持return,但可以使用next跳到下一个语句,它在rake任务中与在方法中使用return具有相同的效果。
task :foo do
puts "printed"
next
puts "never printed"
end
或者您可以移动方法中的代码并在方法中使用return。
task :foo do
do_something
end
def do_something
puts "startd"
return
puts "end"
end
我更喜欢第二种选择。
我倾向于使用abort,这在这种情况下是一个更好的选择,例如:
task :foo do
something = false
abort 'Failed to proceed' unless something
end
我使用了Simone Carletti建议的下一种方法,因为在测试rake任务时,abort(实际上只是用于退出的包装器)并不是理想的行为。
例子:
task auto_invoice: :environment do
if Application.feature_disabled?(:auto_invoice)
$stderr.puts 'Feature is disabled, aborting.'
next
end
如果您想要退出rake任务而不打印“rake abort !”消息,那么您可以使用“abort”或“exit”。但是"abort"在救援块中使用时,会终止任务并打印整个错误(即使不使用——trace)。我用的是exit。