Ruby中的catch和throw在哪里有用?

rye*_*guy 10 ruby

我真的没有看到这些的合理使用.已经有rescueraise,为什么需要throwcatch?似乎它们应该被用来跳出深深的嵌套,但这对我来说只是闻起来像.有没有关于这些的良好,清洁用途的例子?

Joh*_*lla 6

注意:看起来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)

  • @jleedev:在1.9这个工作,所以解释它.有趣! (2认同)

Chr*_*ley 5

它们可以通过将控制权移出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,但这只是模糊了逻辑试图说的内容.

投掷确实是一个"被认为是危险的",但该死的有时它们是最好的解决方案.