Ruby on rails 什么';“这是什么意思?”;对于y中的x“;用红宝石?

Ruby on rails 什么';“这是什么意思?”;对于y中的x“;用红宝石?,ruby-on-rails,ruby,idioms,Ruby On Rails,Ruby,Idioms,我现在正在学习Ruby和RoR,我遇到了这样一个问题: <% for post in @posts %> 在公园里。我知道在Ruby中实现这一点的惯用方法是: <% @posts.each do |post| %> 如果有区别,那是什么呢?如果没有区别的话,Rails的人推广正确的Ruby习惯用法不是更好吗 Edit:我刚刚发现了两种相互矛盾的解释:表示它们是相同的,只是“for循环不会为局部变量创建新的作用域”,而表示for只是等价的的语法糖。每种 Edit

我现在正在学习Ruby和RoR,我遇到了这样一个问题:

<% for post in @posts %>

在公园里。我知道在Ruby中实现这一点的惯用方法是:

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

如果有区别,那是什么呢?如果没有区别的话,Rails的人推广正确的Ruby习惯用法不是更好吗

Edit:我刚刚发现了两种相互矛盾的解释:表示它们是相同的,只是“for循环不会为局部变量创建新的作用域”,而表示
for
只是等价的
的语法糖。每种

Edit2:用于。。。在
中,所讨论的是由
script/generate scaffold
app/views/posts
中生成的
index.html.erb
。我做了一个快速检查,现在生成了
。每个
语法。我猜这部分指南是在rails开发的早期阶段编写的,当时scaffold为。。。在


Edit3:我现在可以确认在Rails 2.2.2中使用了
for x in y
,但是到了2.3.8,它使用了
y.each do | x |
。正如你所知。

第一个例子(
用于@posts
)看起来更“程序化”,而第二个(
@posts.each do | post |
)看起来更“功能化”。不幸的是,程序化的代码读取方式仍然被认为更受欢迎、更清晰、更不“古怪”。这就是为什么,也许许多人更喜欢它而不是通过容器进行迭代的“本地”方式

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


就我个人而言,我希望推动ruby和“功能性”方法。但是上面的原因表明,这两种方法都可以实现。

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

我使用的插件有很多限制。这些限制迫使我提出了非常必要和程序性的解决方案。我使用了
while
for
这样的结构来强调这种编程风格


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

教程点页面是正确的,
for
每个
相同,只是范围不同。下面是一个演示:

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

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

但是请注意,这很少有实际意义,甚至很少有人意识到这一点


当人们在ruby中使用
for
时,最常见的原因是他们习惯于使用其他语言,而不是因为
for
每种
之间有任何差异,如果您试图进行ruby评测,而您的ruby prof版本没有,那么您可能希望使用
for x in y

<关于y中x的
的更多内容是,您可以对1..5中的i执行
操作,这将像循环的标准一样,从
i=1开始执行
i=5


关于这一点,最方便的事情是,你可以使用像
3..8
x..y
这样的范围,你不会从零开始,而你可以使用
n.times
方法。。。in
是用Python进行迭代的标准方法。@skill,也是用其他语言进行迭代的标准方法(例如,过时的Perl语法)。这也是迭代任何集合的自然方式(从人类对它的看法来看)。是的,我明白你的意思。我不是说他们在复制Python,只是说它看起来更像Python。谢谢!正是我想要的。这让我回到了我最初的观点,这就是为什么Rails团队(或者至少是编写《入门指南》的人)会为。。。在
syntax中?有很多人学习rails时没有先学习ruby。我想这本指南的写作风格是为了让来自其他语言的人看起来很熟悉;对于[1,2,3,4]中的x;我认为arr中x的性能方面要快一点,这些结构之间的差异并不重要,但我怀疑这是否是引入这两种结构的真正原因。1.高达(5)。每个{x | |#什么东西}都能处理好吗?@jeba ya会的。我对ruby比较陌生,所以我以前没见过。谢谢你!我每天都学到新东西!您还可以执行
(1..5)。每个

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