是否有可能在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)
所以在场景背后发生的任何魔术都很受欢迎!:)
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