【问题标题】:Ruby loops style/conventionRuby 循环样式/约定
【发布时间】:2017-03-31 04:04:28
【问题描述】:

我想知道如何在 Ruby 中创建以下伪类代码的常规等效代码。我已经阅读了很多关于标准实践的内容,但我只是好奇这个特定循环结构的普遍接受/最干净的方法可能是什么。我没有遇到过直接的例子。

for(i = 0, j = 10; i < 10 && j > 0; i++, j--){
  //do something
}

旁注: 此循环结构的预期目的是对角地遍历数组数组,循环将包含许多中断条件。

【问题讨论】:

    标签: ruby loops iterator coding-style


    【解决方案1】:

    此循环结构的预期目的是对角地遍历数组数组。

    给定一个方阵数组:

    array = [
      [1, 2, 3],
      [4, 5, 6],
      [7, 8, 9]
    ]
    

    您可以通过以下方式沿对角线(从右上角到左下角)遍历它:

    array.each.with_index(1) do |row, i|
      puts row[-i]
    end
    

    输出:

    3
    5
    7
    

    或者,如果您更喜欢(或需要)基于索引的方法:

    0.upto(2).zip(2.downto(0)).each do |i, j|
      p i: i, j: j, element: array[i][j]
    end
    

    输出:

    {:i=>0, :j=>2, :element=>3}
    {:i=>1, :j=>1, :element=>5}
    {:i=>2, :j=>0, :element=>7}
    

    你也可以使用array.each_index.zip(array.each_index.reverse_each)

    【讨论】:

    • 这个。谢谢!
    【解决方案2】:

    你可以这样做

    (0..10).each do |j|
      i = 10 - j
      ...
    end
    
    # 0, 10 -> 10, 0
    

    【讨论】:

      【解决方案3】:

      不是完全等价的,但结果是一样的:

      10.times do |i|
        j = 10 - i
        # do something
      end
      

      或者

      10.times.lazy.map{|i| [i, 10 - i]}.each do |i, j|
        # do something
      end
      

      无论哪种方式,您都有比 @gates' 更清洁的解决方案,因为它们不会将 ij 泄漏到块外。

      或者您可以尝试一种更实用的方法,只是为了好玩:)

      (λ = ->(i, j) {
        # do something
        λ.(i + 1, j - 1) if i < 9 and j > 1
      }).(0, 10)
      

      但不要在大型​​矩阵上这样做,因为 Ruby 没有优化尾递归,因此可能会导致堆栈溢出。

      【讨论】:

      • 最后一个例子是ruby?
      • 是的,它是纯 Ruby。
      • 那是 lambda 吗?可以参考一下吗
      • 当然如果你觉得λ很难输入,你可以把它改成任何有效的标识符。
      • lambda 字面量的语法:-&gt; (params) {body},如果 lambda 不带参数,则为 -&gt; {body}
      【解决方案4】:

      试试这个

      i = 0
      j = 10
      loop do
        break if i > 9 || j < 1 
        # do something
        i = i + 1
        j = j - 1
      end
      

      【讨论】:

      • 是的,对不起-我也应该包括这个。这就是我目前编写的方式,但我想我想知道是否有类似于(0..10).each do |i| #dosomething end 的内置内容(例如:每个)看起来更简洁。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2017-03-27
      • 2012-08-24
      • 1970-01-01
      相关资源
      最近更新 更多