是否有可能用Ruby在两行中编写单语句循环?

通常在Ruby中进行编程时,我发现自己写了一个小的for循环 ,在主体中只有一个语句。 例如…

for number in 1..10 puts number end 

在其他语言如CJavaKotlin (例如)中,我可以在两行中编写相同的代码。 例如…

 // Kotlin for (number in 1..10) println(number) 

在上面的例子中,由于缺少花括号,因此推断出循环体的结束。

Ruby有没有办法模仿这个“for循环”的“单语句”风格?

这里有一些[我的选择/你的潜在答复],以及我对他们的想法。

  • 你可以追加 ; end在身体结束它在同一条线上。

    这是真的,而且非常充分,但是我想知道是否有一个更习惯的方法。

  • 这似乎是不必要的挑剔。 你为什么要这样做?

    你可能会觉得我太挑剔。 你也可能认为我想要做的是非惯用的(如果这是一个字)。 我完全理解,但我仍然很想知道它是否可行!

    这样做可以让我们编写代码, 甚至可以读取更好的代码。 对于程序员来说, 可读性很重要

当然,你正在寻找each 范围#在这个特定的情况下:

 (1..10).each { |number| puts number } 

对于更复杂的迭代,使用doend块语法。 例如

 (1..10).each do |number| puts number some_method_call(number) Rails.logger.info("The #{number} is used") something_else end 

要了解更多,请查看Ruby文档 ,具体请参阅Enumerable 。

只有极少数情况下,任何自尊的Ruby程序员甚至会写一个明确的循环。 该循环为for循环的情况的数量恰好为零。 编写for循环没有“更习惯”的方式,因为循环是非惯用的句点。

还有一个更短的语法。

如果您只是在每个对象上调用一个方法,您可以使用&语法。

 (1..3).collect(&:odd?) # => [true, false, true] 

这是一样的

 (1..3).collect { |each| each.odd? } # => [true, false, true] 

这是在Ruby中编写循环的首选方式。

您将很快习惯Enumerable模块中定义的语法和枚举方法。 一些有用的方法是

  • each评估每个元素的块
  • collect哪个创建新的数组与每个块的结果
  • detect哪个返回块的结果为true的第一个元素
  • select哪个块创建新的数组,其结果为真
  • inject其中应用“折叠”操作,例如sum = (1..10).inject { |a, b| a + b } sum = (1..10).inject { |a, b| a + b }

有趣的是,生产代码的风格指南通常禁止循环,因为一个微妙而危险的范围问题。 在这里查看更多, https://stackoverflow.com/a/41308451/24468