【问题标题】:Why is `for i in a` not idiomatic Ruby? [closed]为什么`for i in a`不是惯用的Ruby? [关闭]
【发布时间】:2015-08-16 01:17:46
【问题描述】:

Ruby 支持for i in a 语法,但没有人真正使用它。 Ruby 的设计原则之一是它的可读性,我发现

for i in a
  ...
end

更具可读性(并且更容易输入)
a.each do |i|
  ...
end

为什么不是首选?其他人不也觉得它更具可读性吗?是否出于一致性原因,例如与 each_with_index 和变量范围等其他函数的关系?

【问题讨论】:

  • 我认为您应该先阅读有关 ruby​​ 块的信息。还有这个问题:stackoverflow.com/questions/3294509/for-vs-each-in-ruby
  • 一旦你训练自己阅读它们,你就会发现它们更具可读性。对我来说,这两种语法似乎都没有任何固有的优势。除此之外,主要是意见,但.each 语法比for 与其他Ruby 习惯用法更符合。看看Array 上的其他迭代器,您会发现不仅.each 适合它们,而且您会经常使用其他迭代器,因为它在处理大批。你很少只是想设置一个迭代器。
  • @konart 我有,我想我理解这些差异。这就是我在问题中所说的“变量范围”的意思。这是不使用它的唯一原因吗?
  • @Sebastian Carroll 的一致性也是如此。
  • 我使用Enumerable#each是因为它只是一个方法调用,而不是另一种语法,而且更OO。

标签: ruby for-loop coding-style iterator


【解决方案1】:

对我来说,这是统一的语法。当我要对数组a 做某事时,我就开始输入a.。我要做什么?筛选? a.select;确定大小? a.size。迭代? a.each

迭代数组没什么特别的,不需要特殊的语言结构。同样each没有立即块会产生一个枚举器,它可以与其他方法链接。

再一次,Ruby 确实有一个很好的for i in a 循环。因此,如果您更习惯使用 for 循环:请务必使用 for 循环。

【讨论】:

  • it is even slightly faster - 我对此表示怀疑。你有证据吗?
  • @cremno monitis.com/blog/2012/02/08/20-ruby-performance-tips,nr 11。但不一定是真的。
  • 嗯,这不可能是真的,因为for 循环调用#each
  • @cremno 我无法对更快的 for 循环进行基准测试,我将删除速度备注
  • @steenslag 感谢您的说明性回复。我现在意识到我一直在以错误的方式看待它。现在我了解了它背后的思考过程,我发现它更具可读性。
【解决方案2】:

因为for 循环不那么客观,在使用上也受到更多限制。

从 OOP 的角度来看,遍历对象元素的可能性是该对象的属性/特征。使用带有全局函数或关键字的显式“外部”方式会发现冗余、不一致且不太客观(封装)。

for 也受到更多限制,它只允许遍历对象元素。另一方面,Enumerator#each 可以让您获得更多。您可以使用枚举器对象,例如在值解包之前与其他方法链接、传递命名块、将方法转换为 procs 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多