Ruby中“for x in y”的意义是什么?

时间:2010-07-27 10:46:39

标签: ruby-on-rails ruby idioms

我正在学习Ruby和RoR,我遇到了这个:

<% for post in @posts %>
Rails guide中的

。我明白在Ruby中这样做的惯用方法是:

<% @posts.each do |post| %>

如果有差异那么它是什么?如果没有差别,那么Rails人们推出适当的Ruby习语(而不是这个,对我来说看起来更像pythonic)不会更好吗?

编辑:我刚刚发现了两个相互矛盾的解释:Tutorials Point说它们是相同的,除了“for循环不会为局部变量创建新范围” ,而CS.Auckland.ac.NZ表示for只是等效.each的语法糖。

Edit2:有问题的for ... in适用于index.html.erb app/views/posts生成的script/generate scaffold。我做了快速检查,现在生成.each语法。我想这篇指南的部分是在支架生成for ... in时在轨道开发的早期阶段编写的。

编辑3:我现在可以确认在Rails 2.2.2中使用了for x in y,但是在2.3.8中它正在使用y.each do |x|。你知道吗。

5 个答案:

答案 0 :(得分:21)

教程点页面是正确的,for等同于each,但范围差异除外。这是一个演示:

arr = [1,2,3]
arr.each do |x|
  last = x
end
last # NameError

VS

arr = [1,2,3]
for x in arr
  last = x
end
last #=> 3

如果您想使用each使其工作,则需要在循环之前执行last = nil。正如链接所指出的那样,这是因为块开始一个新的范围而for没有。

但请注意,这很少有实际意义,很少有人知道它。

当人们在红宝石中使用for时,这通常是因为他们习惯于使用其他语言 - 而不是因为foreach之间的差异。

答案 1 :(得分:0)

问题在于第一个示例(for post in @posts)看起来更“程序化”,而第二个示例(@posts.each do |post|)看起来更“实用”。遗憾的是,阅读代码的程序方式仍然被认为更受欢迎,更清晰,更少“令人讨厌”。这就是为什么许多人更喜欢用迭代容器的“原生”方式。

如果它看起来像pythonic(我不确定它是否真的),那么它可能会被认为更好,因为它改善了来自其他平台的开发人员对Rails的可访问性。

就个人而言,我喜欢红宝石和“功能性”方式。但上述原因表明它可以以任何一种方式完成。

答案 2 :(得分:0)

有一天,我正在开发为我正在制作的网站生成PDF报告的功能。

我使用的插件有很多限制。这些限制迫使我产生非常必要和程序化的解决方案。我正在使用像whilefor这样的结构来强调这种编程风格。

事实上,这是我在ruby中使用这些关键字的唯一情况。

答案 3 :(得分:0)

如果您尝试进行ruby分析,并且您的ruby-prof版本没有method elimination,则可能需要使用for x in y

答案 4 :(得分:0)

关于for x in y的另一件事是,您可以执行for i in 1..5,它将像循环标准一样工作,从i = 1开始并经过i = 5

关于这一点的一个方便之处是你可以使用3..8x..y这样的范围,你不会从零开始,你可以使用n.times方法。< / p>