【问题标题】:Is it possible to write a single-statement for loop in two lines with Ruby?是否可以用 Ruby 在两行中编写一个单语句 for 循环?
【发布时间】:2017-05-12 07:34:14
【问题描述】:

在使用 Ruby 进行编程时,我发现自己经常编写小的 for 循环,主体中只有一条语句。比如……

for number in 1..10
  puts number
end

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

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

在上面的例子中,循环体的结尾是由于缺少花括号而推断出来的。

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

以下是一些 [我的选择/您可能的回复],以及我对它们的看法。

  • 您可以将; end 附加到正文以在同一行结束。

    这是真的,也足够了,但我想知道是否有更惯用的方法。

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

    你可能觉得我太挑剔了。您可能还认为我正在尝试做的事情是不习惯的(如果那只是一个词)。我完全理解,但我仍然很想知道它是否可行!

    这样做可以让我们编写甚至只是一点点更易于阅读的代码。对于程序员来说,可读性很重要

【问题讨论】:

  • 臭名昭著的“goto fail”功能。
  • @Stefan 我认为 heartbleed 也有类似的问题,即缺少花括号。我工作的最后一家公司要求他们在那里。不过,我喜欢排除它们的短暂性,而且我做 TDD,所以我不太可能被这样的意外错误抓住。

标签: ruby for-loop


【解决方案1】:

当然,在这种特殊情况下,您正在寻找 eachRange#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 documentation,尤其是Enumerable

【讨论】:

  • 这很好,虽然我觉得读起来有点不寻常。越用越自然吗?
  • @BrandonIbbotson 是的,它会的。 for 循环真的不需要在 ruby​​ 中使用。
  • @BrandonIbbotson 绝对。这是在 Ruby 中迭代集合的传统方式
  • 完美,谢谢!我会在 10 分钟后将您的答案标记为已接受(假设没有其他人出现并写出更好的答案);)
  • @BrandonIbbotson 是的 :) 另外,使用 {} 作为一个衬垫,如果你需要在块内做更复杂的事情,使用 do end 块,你可以在里面使用在同一迭代中执行新操作的新行
【解决方案2】:

在极少数情况下,任何有自尊心的 Ruby 程序员甚至会编写显式循环。该循环是for 循环的情况数正好为零。没有“更惯用”的方式来编写 for 循环,因为 for 循环是非惯用的句号。

【讨论】:

    【解决方案3】:

    还有更短的语法。

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

    (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 }

    有趣的是,生产代码的样式指南通常完全禁止 for 循环,因为存在一个微妙但危险的范围问题。在此处查看更多信息,https://stackoverflow.com/a/41308451/24468

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 2021-07-01
      • 2018-08-10
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多