我真的没有看到这些的合理使用.已经有rescue和raise,为什么需要throw和catch?似乎它们应该被用来跳出深深的嵌套,但这对我来说只是闻起来像.有没有关于这些的良好,清洁用途的例子?
注意:看起来1.9中的catch/throw会改变一些东西.这个答案适用于Ruby 1.9.
一个很大的区别是你可以做throw任何东西,而不仅仅是衍生自的东西StandardError,不像raise.像这样愚蠢的东西是合法的,例如:
throw Customer.new
Run Code Online (Sandbox Code Playgroud)
但它并不是非常有意义.但你做不到:
irb(main):003:0> raise Customer.new
TypeError: exception class/object expected
from (irb):3:in `raise'
from (irb):3
from /usr/local/bin/irb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)
它们可以通过将控制权移出DSL而无需复杂的case/if语句来简化最终用户的DSL
我有一个Ruby应用程序,允许用户通过内部DSL扩展它.DSL中的某些功能需要将控制权返回给我的应用程序的特定部分.我们举一个简单的例子.假设用户正在开发一个关于日期的简单扩展
if today is a holiday then
do nothing
end
week_of_year = today.week.number
if week_of_year < 10 then
...
Run Code Online (Sandbox Code Playgroud)
该do nothing位触发一个throw,它将控制权交给exec语句并返回给我.
在某些情况下,我们希望它退出并将控制权交还给我的应用程序,而不是继续执行DSL.现在,您可以让用户使用大量嵌入式if语句,并自然地结束DSL,但这只是模糊了逻辑试图说的内容.
投掷确实是一个"被认为是危险的",但该死的有时它们是最好的解决方案.
| 归档时间: |
|
| 查看次数: |
849 次 |
| 最近记录: |