【问题标题】:When, if ever, to use the Ruby keyword "for"何时使用 Ruby 关键字“for”
【发布时间】:2014-12-12 01:40:16
【问题描述】:

我个人喜欢在 Ruby 中使用 for 关键字进行迭代,因为在我看来它读起来非常干净。我一般假设for可能是Enumerable#each的别名,但不知道是否正确。在最基本的例子中:

for i in (1..10)
  puts i
end

行为与

相同
(1..10).each do |i|
  puts i
end

只是没有创建一个新的变量范围。此外,ruby-doc

for 循环在现代 ruby​​ 程序中很少使用。

这让我觉得有一个特定的技术原因反对使用。没有新的变量范围有关系吗?以什么方式?

【问题讨论】:

  • 查看ruby style guide 以获得解释和示例。
  • 你的描述有点矛盾。一方面,您承认使用for您的个人喜好。然后,你写它是干净的从[任何]程序员的眼睛。毕竟,这只是你的个人意见。大多数了解 Ruby 的人更喜欢 each 而不是 for 并认为 each 在他们看来比 for 更干净。你似乎有一个奇怪的意见。
  • “从程序员的角度来看”。从你的程序员的角度来看。每种语言都有其惯用用法,如果您打算分享甚至公开您的代码,学习它们是件好事。虽然我们都有自己喜欢的说话方式,但知道如何用特定的口语正确说话很重要,用编程语言写作也是如此。 Ruby 样式指南是很好的起点。
  • 我个人也更喜欢for 的外观,在Ruby 的早期,for 表现更好。如今,自从each 被更改后,它的性能似乎略有提高。 for 可能还应该进行修复以删除泄漏的本地变量,但这样做会破坏很多代码,不太可能发生。如果您想要 Ruby 2 中最快的迭代,while 循环可能是要走的路(除了习语)。我个人避免使用基于惯用语的风格指南,而首先使用可维护和高性能的东西。我对for 的问题不是它的外观,而是它的副作用。
  • @codenheim,我不认为变量泄漏是需要修复的错误。它的行为与ifwhile 等其他构造的行为一致。我相信这是设计使然。因此,我不认为它归结为美学和主观意见的简单问题。语义差异可能会派上用场,就像||or 的不同优先级一样。 Ruby 开发人员应该了解这两种形式。

标签: ruby for-loop coding-style each keyword


【解决方案1】:

行为与

相同

这是不正确的。 for 建立在 each 之上,但在语义上是不同的:

array = %w(a b c d)

array.each { |character| }
defined? character            # nil

for character in array; end
defined? character            # "local-variable"

for 关键字不会引入新的作用域。块内引入的任何变量在块外仍然可见;好像是内联写的一样。

在决定使用哪种表单时,您应该考虑到这一事实。

【讨论】:

  • Any variables introduced inside the block remain visible outside of it; as if it was written inline. 这似乎是关键的区别。谢谢@Matheus
猜你喜欢
  • 2011-10-03
  • 2014-03-09
  • 2017-08-02
  • 2013-05-26
  • 2023-03-24
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
相关资源
最近更新 更多