我想通过以下方式创建一个用于外部迭代的枚举器next那是clone
-able,以便克隆保留当前枚举状态。
举个例子,假设我有一个方法返回一个枚举器,它产生平方数:
def square_numbers
return enum_for(__method__) unless block_given?
n = d = 1
loop do
yield n
d += 2
n += d
end
end
square_numbers.take(10)
#=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
我想枚举前 5 个平方数,并为每个值打印后续的 3 个平方数。一些微不足道的事情each_cons
:
square_numbers.take(8).each_cons(4) do |a, *rest|
printf("%2d: %2d %2d %2d\n", a, *rest)
end
Output:
1: 4 9 16
4: 9 16 25
9: 16 25 36
16: 25 36 49
25: 36 49 64
但与上面不同的是,我想使用外部迭代使用两个嵌套循环next
and clone
:
outer_enum = square_numbers
5.times do
i = outer_enum.next
printf('%2d:', i)
inner_enum = outer_enum.clone
3.times do
j = inner_enum.next
printf(' %2d', j)
end
print("\n")
end
不幸的是,上述尝试clone
提出:
`initialize_copy': can't copy execution context (TypeError)
据我所知,Ruby 不提供开箱即用的功能。但我自己该如何实现呢?我怎样才能创建一个Enumerator
支持clone
?
I assume这是一个实施的问题initialize_copy
并复制两个变量值n
and d
,但我不知道如何或在哪里做。