Ruby 红宝石优雅的+替代品+;在嵌套循环中?
在任何事情之前,我已经阅读了所有的答案并理解了原因。请注意,这不仅仅是关于是否拥有它的另一个讨论主题 我真正想要的是一个更优雅的解决方案,它让我对Ruby中的Ruby 红宝石优雅的+替代品+;在嵌套循环中?,ruby,loops,syntax,counter,Ruby,Loops,Syntax,Counter,在任何事情之前,我已经阅读了所有的答案并理解了原因。请注意,这不仅仅是关于是否拥有它的另一个讨论主题 我真正想要的是一个更优雅的解决方案,它让我对Ruby中的++/--感到好奇和研究。我已经查找了循环,每个,每个带有索引的以及类似的东西,但是对于这种特定情况,我找不到更好的解决方案 少说话,多代码: # Does the first request to Zendesk API, fetching *first page* of results all_tickets = zd_client.t
++
/--
感到好奇和研究。我已经查找了循环,每个
,每个带有索引的
以及类似的东西,但是对于这种特定情况,我找不到更好的解决方案
少说话,多代码:
# Does the first request to Zendesk API, fetching *first page* of results
all_tickets = zd_client.tickets.incremental_export(1384974614)
# Initialises counter variable (please don't kill me for this, still learning! :D )
counter = 1
# Loops result pages
loop do
# Loops each ticket on the paged result
all_tickets.all do |ticket, page_number|
# For debug purposes only, I want to see an incremental by each ticket
p "#{counter} P#{page_number} #{ticket.id} - #{ticket.created_at} | #{ticket.subject}"
counter += 1
end
# Fetches next page, if any
all_tickets.next unless all_tickets.last_page?
# Breaks outer loop if last_page?
break if all_tickets.last_page?
end
现在,我只需要计数器
用于调试目的-这根本不是什么大问题-但我的好奇心本身就提出了这个问题:有更好(更漂亮、更优雅)的解决方案吗?只为计数器+=1
设置一整行代码似乎相当枯燥。例如,在打印字符串时使用“#{counter++}”
会简单得多(至少为了可读性)
我不能简单地使用。每个的索引,因为它是一个嵌套循环,它会在每个页面(外部循环)重置
有什么想法吗
顺便说一句:这个问题与Zendesk API没有任何关系。我只是用它来更好地说明我的情况
all_tickets.each_with_index(1) do |ticket, i|
我不确定页码是从哪里来的
请参阅。如B7所述,每个带有索引的\u都可以工作,但您可以保留页码,只要所有\u票据都是元组的容器,因为它现在必须工作
all_tickets.each_with_index do |ticket, page_number, i|
#stuff
end
其中i是索引。如果你在所有票证的每个元素中都有超过票证和页码的内容,你可以继续把它们放进去,记住索引是多余的,应该放在最后。我可能过于简化了你的例子,但是你可以像这样从内部和外部范围计算一个计数器
all_tickets = *(1..10)
inner_limit = all_tickets.size
outer_limit = 5000
1.upto(outer_limit) do |outer_counter|
all_tickets.each_with_index do |ticket, inner_counter|
p [(outer_counter*inner_limit)+inner_counter, outer_counter, inner_counter, ticket]
end
# some conditional to break out, in your case the last_page? method
break if outer_counter > 3
end
对我来说,counter+=1
是表示递增计数器的好方法
您可以从0开始计数器,然后通过写入以下内容来获得想要的效果:
p "#{counter += 1} ..."
但我一般不建议这样做,因为人们不希望在字符串插值中发生诸如更改变量之类的副作用
如果您正在寻找更优雅的东西,那么应该创建一个函数,每次调用枚举器上的next
时,它都会一次返回一个整数
nums = Enumerator.new do |y|
c = 0
y << (c += 1) while true
end
nums.next # => 1
nums.next # => 2
nums.next # => 3
all\u tickets.next
获取下一页结果,自动将其分配给all\u tickets
,因此需要再次循环。抱歉@B Seven,我弄错了。在测试/调试和编写问题时,每个都带有。all
。通过票据循环的实际方法是.all
。我已经更新了这个问题。我认为问题不在于Ruby需要++
或--
。counter=1
和counter+=1
的笨重来自设计不干净的事实。该代码有两个职责:获取票据和打印票据。我会使用一个循环获取所有的票证,另一个循环打印它们。考虑到每个结果页都有1k个票证,导致每页有大约7mb的原始文本数据,我不确定将这些数据汇总到内存中,以便稍后一次将其全部循环是否明智。在我的情况下,我将有不到20页,但仍然..也许你可以做p“{page\u number*TICKETS\u PER\u page+I}p{page\u number}…
然后你可以使用每个带索引的\u
。抱歉@Pedro Ivan,我弄错了。每个带的。在测试/调试和编写问题时,所有的。循环检查问题单的实际方法是。所有的。我已经更新了问题。但是,每个带索引的\u
的索引将被重置对外部循环进行计时。我现在无法对其进行测试,但尝试添加一个all.each\u,其中包含自以来的索引。all返回一个集合。[…]/gems/zendesk\u api-1.7.4/lib/zendesk\u api/collection.rb:317:in'\u all':必须传递一个块(ArgumentError)
。不行。需要封锁…你试过吗?所有票。所有。每个有索引的票都可以。票,页码,i|
nums = 1.upto(Float::INFINITY)