是否有可能用Ruby在两行中编写单语句循环?
通常在Ruby中进行编程时,我发现自己写了一个小的for循环 ,在主体中只有一个语句。 例如…
for number in 1..10 puts number end
在其他语言如C
, Java
或Kotlin
(例如)中,我可以在两行中编写相同的代码。 例如…
// Kotlin for (number in 1..10) println(number)
在上面的例子中,由于缺少花括号,因此推断出循环体的结束。
Ruby有没有办法模仿这个“for循环”的“单语句”风格?
这里有一些[我的选择/你的潜在答复],以及我对他们的想法。
-
你可以追加
; end
在身体结束它在同一条线上。这是真的,而且非常充分,但是我想知道是否有一个更习惯的方法。
-
这似乎是不必要的挑剔。 你为什么要这样做?
你可能会觉得我太挑剔。 你也可能认为我想要做的是非惯用的(如果这是一个字)。 我完全理解,但我仍然很想知道它是否可行!
这样做可以让我们编写代码, 甚至可以读取更好的代码。 对于程序员来说, 可读性很重要 。
当然,你正在寻找each
范围#在这个特定的情况下:
(1..10).each { |number| puts number }
对于更复杂的迭代,使用do
– end
块语法。 例如
(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