Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 红宝石优雅的+替代品+;在嵌套循环中?_Ruby_Loops_Syntax_Counter - Fatal编程技术网

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

在任何事情之前,我已经阅读了所有的答案并理解了原因。请注意,这不仅仅是关于是否拥有它的另一个讨论主题

我真正想要的是一个更优雅的解决方案,它让我对Ruby中的
++
/
--
感到好奇和研究。我已经查找了循环,
每个
每个带有索引的
以及类似的东西,但是对于这种特定情况,我找不到更好的解决方案

少说话,多代码:

# 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)