【问题标题】:keep iterating over and over OVER an array在数组上不断迭代
【发布时间】:2016-08-11 08:26:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • over 是什么意思?无限循环?

标签: arrays ruby iterator range


【解决方案1】:

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

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

在 10 次迭代后中断循环:

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

使用#take(感谢@Stefan):

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

反过来:

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

没有#cycle:

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

评论:

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

【讨论】:

  • 您也可以通过附加take(10)来限制迭代次数
【解决方案2】:

Enumerator 的新实例中定义无限循环:

enum = Enumerator.new do |y|
  j = 0
  arr = ['a','b','c'].cycle
  loop do
    y << "j is #{j}, letter is #{arr.next}"
    j += 1
  end
end

enum.next #=> "j is 0, letter is a"
enum.next #=> "j is 1, letter is b"
enum.next #=> "j is 2, letter is c"
enum.next #=> "j is 3, letter is a"

想回到起点吗?使用Enumerator#rewind

enum.rewind
enum.next #=> "j is 0, letter is a"

使用take输出前十次迭代:

puts enum.take 10 #=> 
# j is 0, letter is a
# j is 1, letter is b
# j is 2, letter is c
# j is 3, letter is a
# j is 4, letter is b
# j is 5, letter is c
# j is 6, letter is a
# j is 7, letter is b
# j is 8, letter is c
# j is 9, letter is a

或者使用timesnext

10.times { p enum.next } #=>
# "j is 0, letter is a"
# "j is 1, letter is b"
# "j is 2, letter is c"
# "j is 3, letter is a"
# "j is 4, letter is b"
# "j is 5, letter is c"
# "j is 6, letter is a"
# "j is 7, letter is b"
# "j is 8, letter is c"
# "j is 9, letter is a"

【讨论】:

  • loop.with_index do |_, j|j += 1 更符合红宝石的习惯。
  • @mudasobwa 在这种情况下_ 块参数的目的是什么?
  • 这是loop内部实现的一个不想要的副作用,它将nil块参数传递给块,因此索引作为第二个变量。
  • 另一个选项是0.step { |j| y &lt;&lt; "j is #{j}, letter is #{arr.next}" }
猜你喜欢
  • 2020-08-06
  • 2021-12-28
  • 2018-04-15
  • 2014-09-24
  • 2014-06-25
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 2016-02-25
相关资源
最近更新 更多