ruby - 根据 my_times 定义 my_each

标签 ruby iterator codeblocks control-flow ruby-1.9.1

我正在阅读 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)],其中 xself(整数):

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/

相关文章:

ruby - 如何在 Win7-64 中修复 (OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed)

c++ - SFML 代码完成不适用于 Ubuntu 14.04 上的 Code::Blocks 13.12

c++ - 代码:: block linux glext.h "reference to uint64_t is ambiguous"

ruby-on-rails - Ruby - 根据文件名创建一个类?

ruby - 当我生成进程时出现僵尸进程

ruby - 属性值无

java - java迭代器中的自定义链表无法迭代整个列表

c++ - `const_iterator` 真的需要与 `iterator` 属于不同的类吗?

c++ - 不使用 for 循环传递数据

c - C 中 printf 的函数