我正在阅读 The Well-Grounded Rubyist 并且遇到了一个没有答案的额外信用挑战。
class Array
def my_each
c = 0
until c == size
yield(self[c])
c += 1
end
self
end
end
给出了使用my_times
创建my_each
的例子>
class Array
def my_each
size.my_times do |i|
yield self[i]
end
self
end
end
重点是许多 Ruby 的迭代器都构建在 each
之上,而不是相反。
鉴于上述 my_each
,我如何在 my_times
的实现中使用它?
为了说清楚,之前给出了一个my_times
实现的例子:
class Integer
def my_times
c = 0
until c == self
yield(c)
c += 1
end
self
end
end
5.my_times { |e| puts "The block just got handed #{e}." }
所以看起来这个问题肯定意味着在 my_times
的实现中使用 my_each
。
最佳答案
要使用 my_each
实现 my_times
,您需要做的就是在一个类似于 [0, 1, ..., (x - 1)]
,其中 x
是 self
(整数):
class Integer
def my_times(&block)
(0...self).to_a.my_each do |n|
yield n
end
self
end
end
附言如果您在 Enumerable 而不是 Array 上定义了 my_each
(就像“真正的”each
),您可以从上面的第三行中删除 to_a
并迭代直接在范围之上,而不是先将范围转换为数组。
关于ruby - 根据 my_times 定义 my_each,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30402708/