我正在研究机器人。我有船,每个都放在一个阵列my_ships
。每艘船在创建时都会获得id
,而不是创造它的人,并且每艘船都可以被销毁。这是第一个数组:
ship = Ship.new(
player_id, id,
Float(x),
Float(y),
Integer(hp),
Integer(status),
Integer(progress),
Integer(planet)
)
每次迭代都会发送命令。我遇到了超时问题。我只有足够的时间跑〜100。
如何限制我的each
循环只运行100次?
my_ships(0, 100).each do |ship|
当一些人被摧毁时,我会减少使用的船只,他们按照他们的身份命令。
假设这不在某种数据库中,你应该使用数据库查询来选择和限制(因为没有标记db-related),你可以使用Enumerable#lazy
(这也是数组的方法,因为数组的是可枚举的)。你首先要只选择未被销毁的船只,然后只选择其中的first
100:
my_ships.lazy.select do |ship|
# Some logic to see if a ship is allowed to be iterated
end.first(100).each do |ship|
# your loop that runs commands
end
my_ships.lazy.reject do |ship|
# Some logic to see if a ship should not be iterated
end.first(100).each do |ship|
# your loop that runs commands
end
为了更清楚地了解这将为您做些什么,请考虑以下示例:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers.lazy.select do |number|
puts "running check for #{number}"
number.even?
end.first(2).each do |number|
puts "doing something with #{number}"
end
# running check for 1
# running check for 2
# running check for 3
# running check for 4
# doing something with 2
# doing something with 4
所以在这个例子中,我想为前2个偶数运行一个循环...如果我只取前2个数字,我得到1个偶数和1个奇数;我也不想遍历整个列表,因为检查是否均匀?可能很贵(不是,但你的支票可能是),或者你的清单可能很大,你只需要一些物品。这循环足以让我得到符合我标准的前2个数字,然后让我在它们上面运行循环。
正如@ user3309314在comments中所建议的那样,您可能希望使用next
。
arr = (1..100).to_a
enum = arr.to_enum
hun = loop.with_object [] do |_,o|
if o.size == 10
break o
elsif enum.peek.even?
o << enum.next
else
enum.next
end
end
hun #=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
这个loop
通过枚举遍历arr
的每个元素,并将其添加到另一个数组o
,如果它满足条件even?
。当break
时,循环o.size == 10
s。
可能更容易创建一个更明确的枚举器,然后从中获取。这样你可以改变你需要多少元素enum.take(8)
可以获得前8个元素等。
enum = Enumerator.new do |y|
arr = (1..100).to_a
enum = arr.to_enum
loop { enum.peek.even? ? y << enum.next : enum.next }
end
enum.take 10 #=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]