我有一个for循环,我希望永远增加。
我的代码:
for a in (0...Float::INFINITY).step(2)
puts a
end
输出:
0.0
2.0
4.0
Etc. Always with "#{a}.0"
有没有办法将无穷大表示为整数,以便输出最后没有.0
而不对循环内容进行任何操作?
附录
你能解释一下你的循环是如何工作的吗?我试图找到最有效的解决方案,因为这个循环将迭代无限,削减几毫秒将大大提高性能。
另外...
我会接受最短时间运行到1000000的解决方案
根据 benchmark
@Sefan和while
循环答案都需要相同的时间Fruity
while
循环答案需要比较短,for
循环答案为秒,但多个loop do
答案需要更长时间。
由于其原因超出了本问题的范围,我创建了另一个问题,解决了为什么某些循环比其他循环更快(https://stackoverflow.com/questions/33088764/peddle-to-the-metal-faster-loop-faster)。
答案 0 :(得分:10)
您可以在不传递限制的情况下使用Numeric#step
:
0.step(by: 2) { |i| puts i }
输出:
0
2
4
6
...
您还可以构建自己的Enumerator
:
step2 = Enumerator.new do |y|
a = 0
loop do
y << a
a += 2
end
end
step2.each { |i| puts i }
答案 1 :(得分:5)
您可以使用while true
:
puts a = 0
puts a+=2 while true
顺便说一句,
有没有办法将无穷大表示为整数
否强>
答案 2 :(得分:4)
require 'bigdecimal'
(0..BigDecimal('Infinity')).step(2).each{ |n| puts n }
OR
require 'bigdecimal'
for a in (0...BigDecimal::INFINITY).step(2)
puts a
end
答案 3 :(得分:4)
这就是循环方法的设计目的。 loop
没有条件可以运行。它将无限期运行,退出的唯一方法是使用关键字break
。 (或提出StopIteration
)
a = 0
loop { puts a += 2}
这个循环将是无限的,因为没有指定break
。
break
可以与其他答案如何使用while条件非常类似地指定:
a = 0
loop do
puts a += 2
break if a > 1_000_000
end
一旦loop
的值超过1M,此a
现在将退出。
据说@Stefan的答案更有效率,因为它不存储这个整数值或者必须执行任何额外的赋值,而是简单地从枚举器中产生数字并在之后丢弃它。这种用途的实用性更多地取决于您对此循环的实现和目的。
答案 4 :(得分:0)
试试这个:
$(document).on("action","element",function()
如果你想要无限循环,那么,不要将任何参数传递给arr = [0]
arr.cycle(1000000) { |i| puts arr[0] +=2 }
cycle
答案 5 :(得分:0)
a = [-2]
puts a.unshift(a.shift+2) while 'loop forever'