在此之前,我已经阅读了Why doesn't Ruby support i++
or i—
?的所有答案并明白为什么。请注意,这不仅仅是另一个关于是否拥有它的讨论话题。
我真正想要的是一个更优雅的解决方案,以解决让我对 Ruby 中的 ++
/--
感到疑惑和研究的情况。我查找了循环、each
、each_with_index
和类似的东西,但找不到更好的解决方案针对这种特定情况。
少说话,多代码:
# 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
目前,我需要 counter
仅用于调试目的——这根本不是什么大问题——但我的好奇心本身就提出了这个问题:是否有更好(更漂亮、更优雅)的解决方案这?只为 counter += 1
写一整行看起来很无聊。举个例子,在打印字符串时使用 "#{counter++}"
会简单得多(至少为了可读性)。
我不能简单地使用 .each
的索引,因为它是一个嵌套循环,并且它会在每个页面(外循环)处重置。
有什么想法吗?
顺便说一句:这个问题与 Zendesk API 没有任何关系。我只是用它来更好地说明我的情况。
最佳答案
对我来说,counter += 1
是表达递增计数器的好方法。
你可以从 0 开始你的计数器然后通过写得到你想要的效果:
p "#{counter += 1} ..."
但我通常不推荐这样做,因为人们不希望在字符串插值中发生更改变量等副作用。
如果您正在寻找更优雅的东西,您应该制作 Enumerator每次您在枚举器上调用 next
时,一次返回一个整数。
nums = Enumerator.new do |y|
c = 0
y << (c += 1) while true
end
nums.next # => 1
nums.next # => 2
nums.next # => 3
除了在上面的代码中使用 Enumerator.new
,您还可以这样写:
nums = 1.upto(Float::INFINITY)
关于嵌套循环中++ 的 Ruby 优雅替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30469311/