我正在读有根据的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
。
4条答案
按热度按时间gj3fmq9x1#
要使用
my_each
实现my_times
,您只需在类似[0, 1, ..., (x - 1)]
的阵列上调用my_each
,其中x
是self
(整型):备注:如果您在Eventable上定义了
my_each
,而不是在数组上定义了my_each
(就像“Real”each
一样),则可以从上面的第三行中删除to_a
并直接在范围内迭代,而不是首先将范围转换为数组。7jmck4yq2#
为了实现My_Times,我们需要一个数组来向其发送My_Each消息。在本书的这一点上,我认为范围没有被涵盖,所以我没有使用范围来实现。以下是解决方案:
u3r8eeie3#
编辑:我刚刚注意到Jordan使用了
...
而不是..
,这会生成正确的输出;有关范围差异的更多详细信息,请参阅answer。我已经在下面更新了我的答案。我的账号太新了,我不能评论Jordan的解决方案;我看到这是大约一年前发布的,但我现在正在阅读有根据的Rubyist,想对这个解决方案发表评论。
我以与Jordan相同的类似方式处理它,但发现与
my_times
的有充分根据的Rubyist实现相比,输出是不正确的:乔丹的解决方案产出:
我使用了一个幻数来匹配基础良好的Rubyist输出**[参见Jordan的解决方案,使用
...
而不是..
,这消除了对幻数的需要]**jhdbpxl94#
我缩短了dwyd的实现以提供一个块,而不是使用do..end。
还有,我不认为你需要做
self-1
。