继续遍历数组迭代

Sal*_*uel 0 ruby arrays iterator range

我意识到我的沟通技巧并不那么出色(我甚至在试图查找它时遇到问题),所以我让代码说话:

easy_as_123 = ("a".."c").to_a
10.times do |j|
  if j >= easy_as_123.length
    puts "j is #{j}, letter is #{easy_as_123[j % easy_as_123.length]}"
  else 
    puts "j is #{j}, letter is #{easy_as_123[j]}"
  end
end
Run Code Online (Sandbox Code Playgroud)

是否有一个更优雅和简洁的解决方案,以不断迭代我的[a,b,c]数组?

编辑,我发布的代码作品,这正是我正在寻找的结果,但它不简洁也不好看,有没有方法能够以更优雅的方式实现同​​样的结果?

Ale*_*kin 5

Enumerable#cycle是你的朋友.无限循环:

(?a..?c).cycle.with_index do |letter, j|
  puts "j is #{j}, letter is #{letter}"
end
Run Code Online (Sandbox Code Playgroud)

在10次迭代后打破一个循环:

(?a..?c).cycle.with_index do |letter, j|
  break if j >= 10
  puts "j is #{j}, letter is #{letter}"
end
Run Code Online (Sandbox Code Playgroud)

使用#take(积分给@Stefan):

(?a..?c).cycle.take(10).each.with_index do |letter, j|
  puts "j is #{j}, letter is #{letter}"
end
Run Code Online (Sandbox Code Playgroud)

另一边:

enum = (?a..?c).cycle
10.times do |j|
  puts "j is #{j}, letter is #{enum.next}"
end
Run Code Online (Sandbox Code Playgroud)

没有#cycle:

enum = (?a..?c).to_a
10.times do |j|
  puts "j is #{j}, letter is #{enum[j % enum.length]}"
end
Run Code Online (Sandbox Code Playgroud)

评论:

  • if 是多余的;
  • to_a 是冗余的,可能会枚举范围.