【问题标题】:Change index variable within ruby loop在 ruby​​ 循环中更改索引变量
【发布时间】:2013-06-03 05:51:28
【问题描述】:

我意识到这可能违反了 ruby​​ 原则并且可能看起来有点傻,但我很好奇是否可以在 ruby​​ 中循环迭代期间修改索引变量。

这种做法在 Java/C 中可以通过这个人为的示例中的 for 循环来实现:

for (int k = 0; k < 10; k++)
{
   if (k == 5)
      k = 8;
}

同样,我知道可以使用 Enumerable#each_with_index 访问索引变量,但我对在此实例中更改变量而不是访问它的能力感兴趣。

【问题讨论】:

  • 你为什么要这样做?
  • 正如 fotanus 所说 - 可以在 ruby​​ 中模仿这段代码,但我无法想象任何真正的问题可以通过这种方式解决。

标签: ruby iteration


【解决方案1】:

其实for语义如下:

for(executed_once_before_all; test; execute_every_loop) { /* code */ }

所以,在红宝石中:

executed_once_before_all
while test do
  execute_every_loop
  # code
end 

所以你的例子是这样的:

k = 0
while k < 10 do
  k = 8 if (k == 5)
  k += 1
end         

【讨论】:

  • 最后一个while不正确吗? k 应该在循环结束时增加,否则你不会使用值为 0 的 k 并且最后你将有 k == 10 当不考虑该值时。
  • 是的,你是对的,在第一个 for interation 中最后一个子句没有被执行
【解决方案2】:

在 Ruby 中更改 for 循环计数器不会更改迭代次数。

您可以更改计数器变量,但这只会影响当前迭代:

> for k in 0...10
>   k = 8 if k == 5
>   puts k
> end
0
1
2
3
4
8  # Note this!
6
7
8
9

实现所需行为的最佳方法是按照@fotanus 的建议使用while 循环。

当然,您可以使用next 语句通过for 循环来做到这一点,但这更难看:

for k in 0...10
  next if k > 5 && k <= 8
  ... do stuff ...
  next if k == 5
  ... do stuff ...
end

【讨论】:

    【解决方案3】:

    您可以这样做,但 Ruby 程序员通常不使用 for 循环(尽管它可用)。你也可以这样做:

    [0,1,2,3,4,5,8,9,10].each do |index|
      # your code here
    end
    

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 2023-04-05
      • 1970-01-01
      • 2015-10-01
      相关资源
      最近更新 更多