如果块中的一个语句在Ruby中返回true,如何返回true?

Leo*_*Leo 3 ruby

是否有可能在Ruby中创建一个方法,它接受一个块并运行块中的每个语句,直到其中一个返回false?

done = prepare_it do |x|
  method_1
  method_2
  method_3
end
puts "Something did not work" unless done
Run Code Online (Sandbox Code Playgroud)

我希望函数prepare_it运行每个语句,但如果其中一个语句失败,则该函数退出.如果函数返回true,则表示所有步骤都成功.

这似乎要求一个异常,但我不确定如何触发和处理它.我希望我没有必要修改method_x函数以在失败时抛出异常,而是让prepare_it抛出异常,如果其中一个method_x失败(返回false)

编辑: 感谢您的建议,我想我需要在我的问题中添加更多细节.这是我第一次尝试元编程和创建DSL.:)

我有一个类向路由器发送命令.总是需要按顺序执行许多步骤(连接,登录,传递等).我认为如果用户愿意,可以让用户更改命令的顺序.例如,某些路由器不会要求用户直接进入密码提示.其他人完全跳过登录.在某些情况下,您需要提升权限或设置终端选项.

但是,如果任何命令失败,应该有一种机制使整个块失败.因此,如果由于某种原因密码失败(该方法返回false/nil),继续使用其余命令是没有意义的.而且我应该告诉它事情失败了.

&&方法有效,但我认为它不是一个很好的界面.

也许我应该强迫用户给我一个较小的块,一次一个,这些块放在一个堆栈中,然后运行命令逐个产生?

my_router.setup do {send_pass}
my_router.setup do {set_terminal}
my_router.setup do {enable_mode}
my_router.run_setup
Run Code Online (Sandbox Code Playgroud)

我认为如果我能做的话会更加清洁

my_router.setup do |cmd|
  cmd.send_pass
  cmd.set_terminal
end
puts "Done" if my_router.ready?
Run Code Online (Sandbox Code Playgroud)

所以在场景背后发生的任何魔术都很受欢迎!:)

Pab*_*dez 9

done = prepare_it do |x|
  method_1 && method_2 && method_3
end
puts "Something did not work" unless done
Run Code Online (Sandbox Code Playgroud)

说明

&&操作者"短路",所以如果method_1返回false,2和3将不会被调用和done将是false.

http://gist.github.com/1115117

  • 短路实际上会像这样工作吗?这不是还需要method_1,method_2和method_3来返回一个布尔值吗?我的Ruby非常生疏,但这似乎对我很怀疑. (2认同)