【发布时间】:2020-07-05 10:14:18
【问题描述】:
我正在 Ruby 中创建自己的 .each 方法版本,但在实现它以用于 Range (1..10) 的输入时遇到问题。
module Enumerable
# @return [Enumerable]
def my_each
return to_enum :my_each unless block_given?
index = 0
while index < size
if is_a? Array
yield self[index]
elsif is_a? Hash
yield keys[index], self[keys[index]]
elsif is_a? Range
yield self[index]
end
index += 1
end
end
end
如果通过了,我会尝试通过
r_list = (1..10)
r_list.my_each { |number| puts number }
输出将是
=>
1
2
3
4
5
6
7
8
9
10
【问题讨论】:
-
each不在Enumerable中是有原因的:每个可枚举对象都应该提供自己的each,Enumerable中的方法可以依靠它来准确地提供迭代对象的元素。也就是说...产生self.begin + index应该没问题。 -
对于@Amadan 的评论,请考虑
Enumerable#map。还有一种方法Array#map当然Array包括Enumerable。我们发现[1].method(:map).owner #=> Array和[1].method(:map).super_method.owner #=> Enumerable,所以arr.map { ... }调用Array#map。包括Enumerable的每个类C都是一样的。C已经有一个方法C#each所以你的Enumerable#each不会被使用。结果是创建Enumerable方法each似乎毫无意义。
标签: ruby enumerable