gpt4 book ai didi

ruby - 在 Enumerable#each_cons 中跳过 'n' 次迭代

转载 作者:数据小太阳 更新时间:2023-10-29 07:36:38 25 4
gpt4 key购买 nike

在执行each block 时是否可以跳过n 次迭代?

persons.each_cons(2) do |person|
if person[0] == person[1]
#SKIP 2 iterations
end

puts "Howdy? #{person[0]}"
end

最佳答案

只需使用 Enumerator明确地:

persons = [1, 2, 1, 1, 1, 3]
enum = persons.each_cons(2)

loop do
p1, p2 = enum.next
if p1 == p2
2.times { enum.next }
else
puts "Howdy? #{p1}"
end
end


一些注意事项:

  • 所有循环(例如 while , for , loop )已经解救了 StopIteration默认为 break ing(惊喜),制作next super 简单
  • 明确使用 Enumerator就像它得到的 Ruby 一样!拿一本最近的 Ruby Pickaxe 书,浏览到第 4.3 章( block 和迭代器)并尽情享受吧!
  • 不要错过并行作业,即使是在 block 中也是如此
  • 如果您在导航 Enumerable 时遇到问题就像你想要的那样,我建议花 10 分钟阅读模块文档:许多人可以找到 #each_cons 之间的区别。和 #each_slice和我一样富有启发性。
    特别是,至少检查所有以 chunk 开头的方法名称 , drop , eachslice (欢迎在评论中提出更多建议!)。不得不打电话 #next手工实际上很少见。

奖励积分:

了解“迭代器”和 Enumerator 之间的区别(与上面提到的同一 Pickaxe 章节)实际上确实派上用场了。
有时通过构建自定义迭代器可以更好地解决您的难题:

persons = [1, 2, 1, 1, 1, 3]
custom_iter = Enumerator.new do |yielder|
en = persons.each_cons(2)
loop do
2.times { en.next } while (p1, p2 = en.next).reduce(:==)
yielder.yield p1
end
end

custom_iter.each { |pers| puts "Howdy? #{pers}" }

为什么要了解自定义迭代器?想象一下,您需要对任意大的(注意 #lazy )偶数集进行操作:

def Integer.even from:0
Enumerator.new do |yielder, n: (from.even? ? from : from+1 )|
loop { yielder.yield n; n += 2}
end.lazy
end

p Integer.even(from: 3).take(10).to_a

Ruby 公开元素枚举而不是列表迭代的方式可以改变您对序列和集合的看法——给它一个机会 ;)

关于ruby - 在 Enumerable#each_cons 中跳过 'n' 次迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11508677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com