【发布时间】:2020-10-19 14:07:59
【问题描述】:
我想通过next创建一个用于外部迭代的枚举器,即clone-able,以便克隆保留当前的枚举状态。
例如,假设我有一个返回枚举器的方法,该枚举器产生square numbers:
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
输出:
1: 4 9 16
4: 9 16 25
9: 16 25 36
16: 25 36 49
25: 36 49 64
但与上述不同的是,我想使用 外部迭代 使用两个嵌套循环以及 next 和 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 不提供开箱即用的功能。但是我怎样才能自己实现呢?如何创建支持clone 的Enumerator?
我假设这是实现initialize_copy 并复制n 和d 的两个变量值的问题,但我不知道如何或在哪里执行它。
【问题讨论】:
-
顺便说一句,我设法使用 proc 和保存局部变量的显式绑定来使其工作。这是一个非常肮脏的 hack ......但它是可能的。
-
你为什么不发布你所做的?我希望这只是创建类的一种迂回方式,就像我建议的那样 (wiki.c2.com/?ClosuresAndObjectsAreEquivalent)。
标签: ruby clone enumerator