【发布时间】:2011-07-30 02:06:18
【问题描述】:
是否可以在 Ruby 中创建一个方法,该方法接受一个块并运行块中的每个语句,直到其中一个返回 false?
done = prepare_it do |x|
method_1
method_2
method_3
end
puts "Something did not work" unless done
我希望函数 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
如果可以的话,我觉得会超级干净
my_router.setup do |cmd|
cmd.send_pass
cmd.set_terminal
end
puts "Done" if my_router.ready?
所以欢迎在幕后发生的任何魔术! :)
【问题讨论】:
标签: ruby