我正在学习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|
。你知道吗。
答案 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
时,这通常是因为他们习惯于使用其他语言 - 而不是因为for
和each
之间的差异。
答案 1 :(得分:0)
问题在于第一个示例(for post in @posts
)看起来更“程序化”,而第二个示例(@posts.each do |post|
)看起来更“实用”。遗憾的是,阅读代码的程序方式仍然被认为更受欢迎,更清晰,更少“令人讨厌”。这就是为什么许多人更喜欢用迭代容器的“原生”方式。
如果它看起来像pythonic(我不确定它是否真的),那么它可能会被认为更好,因为它改善了来自其他平台的开发人员对Rails的可访问性。
就个人而言,我喜欢红宝石和“功能性”方式。但上述原因表明它可以以任何一种方式完成。
答案 2 :(得分:0)
有一天,我正在开发为我正在制作的网站生成PDF报告的功能。
我使用的插件有很多限制。这些限制迫使我产生非常必要和程序化的解决方案。我正在使用像while
或for
这样的结构来强调这种编程风格。
事实上,这是我在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..8
或x..y
这样的范围,你不会从零开始,你可以使用n.times
方法。< / p>