2014-10-27 15 views
4

我想在每个循环迭代中增加我的步进值,但我的解决方案不起作用。如何更改循环内的步进值?

n=1 
(0..100).step(n) do |x| 
puts x 
n+=1 
end 

有什么办法可以改变“n”,或者我必须使用“while循环”或其他的?

+6

我怀疑这将是可行的。即使是这样,我也不认为你应该*,因为它打破了“step”这个普遍接受的行为。使用明确的代码。 – 2014-10-27 13:38:49

回答

6

我假设你要打印1,3,6,10,15,21等

step documentation说:

迭代超出范围,将每个第n个元素传递给该块。如果范围 包含数字,则为每次迭代添加n。

所以你想要做的事不能用step完成。 A while或传统的for循环应该做的伎俩。

+0

不能用'Range#step'完成,但确实可以用'Numeric#step'完成 – vgoff 2014-10-27 22:41:17

2

我认为最好的做法是使用while循环。

step = 1 
last = 100 
i = 0 
while (i < last) 
    puts i 
    step += 1 
    i += step 
end 

可能可以步骤做到这一点,但它需要你完全了解它是如何工作的,并可能使用一些哈克的东西,使其工作。但是当你有一个简单的解决方案时,为什么要这样做呢?

2

我会loop做和break

n = 0 
step = 1 
loop do 
    puts n 
    n = n + step 
    step += 1 
    break if n > 100 
end 
+1

这可以很好地包装在一个自定义的'枚举器'。 – Stefan 2014-10-27 14:41:27

+0

当你有一个很好的条件语句时,为什么使用'break'和一个无限''loop'',你可以使用'while'或'until'语句? – vgoff 2014-10-28 07:57:58

+0

我首先用〜开始,而〜和rubocop建议使用〜loop〜。我发现它很有趣。 – 2014-10-28 08:46:32

0

我认为你在问,现在我再看一遍,正在改变step给予step方法的块内的参数。这是不可能的,因为在步骤可以继续运行给定块的工作之前,对步骤的参数进行评估,并且分配块变量x

+0

你可以在这个例子中调整'':' – 2014-10-27 23:43:04

+0

递增,如+ 1,+ 2,+ 3,否,不是动态的。不,在运行时不是递增的。一段时间或直到循环会更好,现在我再次看。 – vgoff 2014-10-28 07:36:04

+0

当他说“在每个循环迭代”中表示循环迭代内部时,我不会将其重新定义为循环迭代,而是错误地提出了他的问题措词。但我认为他的意思是后者。但是,这是不可能的,因为'n'变量的范围是不同的事情,首先。 – vgoff 2014-10-28 07:51:39

3

下面是基于Aurélien Bottazini's answer定制Enumerator

tri = Enumerator.new do |y| 
    n = 0 
    step = 1 
    loop do 
    y << n 
    n = n + step 
    step += 1 
    end 
end 

tri.take(10) 
#=> [0, 1, 3, 6, 10, 15, 21, 28, 36, 45] 

tri.take_while { |i| i < 100 } 
#=> [0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91] 
+0

我不介意这里的无限循环,它在枚举器中,并且被清晰地控制。没有隐藏的“休息”条件。您适当地控制枚举器。 – vgoff 2014-10-29 21:59:38