在Perl中,有一种打破外部循环的能力,如下所示:

AAA: for my $stuff (@otherstuff) {
         for my $foo (@bar) {
             last AAA if (somethingbad());
         }
      }

(语法可能错误),它使用循环标签从内部循环中断开外部循环.Ruby中有类似的东西吗?

推荐答案

您需要的是非本地控制流,Ruby有几个选项:

  • 延续,
  • 例外情况,以及
  • throw/catch

Continuations

赞成的意见:

  • 连续性是非局部控制流的标准机制.事实上,你可以在它们之上构建any个非本地控制流(子程序、过程、函数、方法、协同程序、状态机、生成器、条件、异常):它们几乎是GOTO个更好的孪生子.

欺骗:

  • 延续不是Ruby语言规范的强制性部分,这意味着一些实现(XRuby、JRuby、Ruby.NET、IronRuby)没有实现它们.所以,你不能依赖他们.

Exceptions

赞成的意见:

  • 有一篇论文从数学上证明了例外可能比延续更强大.IOW:他们可以做延续所能做的一切,甚至更多,所以你可以用他们来代替延续.
  • 例外情况是普遍存在的.

欺骗:

  • 它们被称为"例外",这让人们认为它们"只适用于例外情况".这意味着三件事:阅读你的代码的人可能不理解它,实现可能没有针对它进行优化(是的,在几乎任何Ruby实现中,异常都非常慢),最糟糕的是,你会厌倦所有这些人不断无意识地唠叨"异常只适用于异常情况",只要他们一看你的代码.(当然,他们甚至不会试图理解你在做什么.)

100/101

这(大致)就是它的样子:

catch :aaa do
  stuff.each do |otherstuff|
    foo.each do |bar|
      throw :aaa if somethingbad
    end
  end
end

赞成的意见:

  • 与例外情况相同.
  • 在Ruby 1.9中,对控制流使用异常实际上是part of the language specification!循环、枚举器、迭代器等都使用StopIteration异常来终止.

欺骗:

  • Ruby社区对它们的厌恶甚至超过了对控制流使用异常.

Ruby相关问答推荐

在Glade创建的UI中以编程方式填充GtkTreeView

有没有办法把条件语句写得更干净?

ruby 中嵌套哈希中相同键的平均值

如何判断 postgres 中使用 ruby​​ 的查询是否失败?

这个#divmod 方法输出这个结果是做什么的?

如何在 Ruby 中为链表实现#pop

如何返回此 OOP Ruby 代码最后一行中的变量?

数组切片中没有左边框的Ruby范围

有没有办法在 Capybara 中保持登录状态?

在 MacOS Sierra 上使用 RMagick 2.16 的 ImageMagick 7 找不到 MagickWand.h

在文件中搜索字符串的最佳方法是什么?

在 Selenium WebDriver 中按 Ctrl + A

就地修改 ruby​​ 哈希(rails strong params)

如何设置方法测试中使用的私有实例变量?

如何按字母顺序对字符串字符进行排序?

Ruby 删除目录

为什么 __FILE__ 大写而 __dir__ 小写?

为什么在安装 gem 时出现权限被拒绝错误?

常见的 Ruby 习语

如何在 Ruby 中对数组进行分块