嵌套循环中++ 的 Ruby 优雅替代方案?

标签 ruby loops syntax counter

在此之前,我已经阅读了Why doesn't Ruby support i++ or i—?所有答案并明白为什么。请注意,这不仅仅是另一个关于是否拥有它的讨论话题

我真正想要的是一个更优雅的解决方案,以解决让我对 Ruby 中的 ++/-- 感到疑惑和研究的情况。我查找了循环、eacheach_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/

相关文章:

ruby - 这是正则表达式错误还是其他问题?

ruby-on-rails - Ruby/Rails - 检查 HABTM 关系记录中是否存在子 ID

ruby-on-rails - 如何在ruby中将阿拉伯数字转换为数字

r - 在 for 循环中提取数据并将其 append 到新数据集

flash - 救命! Actionscript中令人困惑的语法错误1084,要求使用分号?

ruby - pry ( ruby REPL): How can I turn automatic echo off

loops - 在 Common Lisp 循环中定义局部变量

c++ - for循环的小疑问

python - 缩进错误 : unexpected indent error

sql - 如何在 SELECT a.*, b.* 中自动重命名列名以具有 ie。结果列名称中的前缀 a_ 和 b_?