根据我的时间定义我的每个人

4ngedf3f  于 2022-09-21  发布在  Ruby
关注(0)|答案(4)|浏览(143)

我正在读有根据的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

gj3fmq9x

gj3fmq9x1#

要使用my_each实现my_times,您只需在类似[0, 1, ..., (x - 1)]的阵列上调用my_each,其中xself(整型):

class Integer
  def my_times(&block)
    (0...self).to_a.my_each do |n|
      yield n
    end
    self
  end
end

备注:如果您在Eventable上定义了my_each,而不是在数组上定义了my_each(就像“Real”each一样),则可以从上面的第三行中删除to_a并直接在范围内迭代,而不是首先将范围转换为数组。

7jmck4yq

7jmck4yq2#

为了实现My_Times,我们需要一个数组来向其发送My_Each消息。在本书的这一点上,我认为范围没有被涵盖,所以我没有使用范围来实现。以下是解决方案:

require_relative "my_each"
class Integer
  def my_times
    array = Array.new(self)
    c = 0
    array.my_each do
      array[c] = c
      yield(c)
      c += 1
    end
    self
  end
end
u3r8eeie

u3r8eeie3#

编辑:我刚刚注意到Jordan使用了...而不是..,这会生成正确的输出;有关范围差异的更多详细信息,请参阅answer。我已经在下面更新了我的答案。

我的账号太新了,我不能评论Jordan的解决方案;我看到这是大约一年前发布的,但我现在正在阅读有根据的Rubyist,想对这个解决方案发表评论。

我以与Jordan相同的类似方式处理它,但发现与my_times有充分根据的Rubyist实现相比,输出是不正确的:

puts 5.my_times { |i| puts "I'm on iteration # {i}!" }
I'm on iteration 0!
I'm on iteration 1!
I'm on iteration 2!
I'm on iteration 3!
I'm on iteration 4!

乔丹的解决方案产出:

puts 5.my_times { |i| puts "I'm on iteration # {i}!" }
I'm on iteration 0!
I'm on iteration 1!
I'm on iteration 2!
I'm on iteration 3!
I'm on iteration 4!
I'm on iteration 5!

我使用了一个幻数来匹配基础良好的Rubyist输出**[参见Jordan的解决方案,使用...而不是..,这消除了对幻数的需要]**

class Integer
  def my_times
    (0..(self-1)).to_a.my_each do |n|
      yield n
    end
    self
  end
end
jhdbpxl9

jhdbpxl94#

我缩短了dwyd的实现以提供一个块,而不是使用do..end。

class Integer
  def my_times
    (0...self).to_a.my_each { |i| yield i }
  end
end

还有,我不认为你需要做self-1

相关问题