0

我正在阅读ruby​​ 编程语言。在本书的第 251 页,有以下代码:

countdown = Object.new # A plain old object
def countdown.each # The each iterator as a singleton method
    yield 3
    yield 2
    yield 1
end
countdown.extend(Enumerable) # Now the object has all Enumerable methods
print countdown.sort # Prints "[1, 2, 3]"

我不明白。数字 ( 1, 2, 3) 是从哪里来的?yield方法接收它们。但那些不是成员变量,是吗?

4

2 回答 2

1
  1. 实际上,如果您查看Object#extend的定义,您会看到它“将每个模块的实例方法作为参数添加到 obj 中” 。在内部,它调用Module.extend_object模块的实例方法并将其添加到 Ruby 对象的单例类中。

  2. Yield 方法不接收,它... yield :-) 为了使 Enumerable 工作,each方法应该产生对象的连续元素 - 这正是它所做的。如果您要像这样将块传递给此方法:

    countdown.each { |x| 放 x }

    您会看到 3 2 1 作为输出。排序仅用于each获取条目的完整列表,然后对它们进行排序。

于 2013-02-14T07:06:16.103 回答
0

不,它们不是成员/实例变量。如果我理解您的要求,Enumerable是一个模块,它定义了许多方便的收集方法,例如sort. 您将它添加到一个类中,它会带来所有这些方法。它唯一需要做的就是定义一个名为each. 它应该接受一个块,然后将集合的每个成员“屈服”回该块。sort(或其他)将调用each然后对返回的成员执行某些操作。

在这种情况下,对象是荒谬的,成员被硬编码到each方法中。你可以说这是一种混淆的形式:

`print [3, 2, 1].sort`
于 2013-02-14T07:08:44.327 回答