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]"

私はそれを理解することはできません。数字 ( 123) はどこから来たのですか? yieldメソッドがそれらを受け取ります。しかし、それらはメンバー変数ではありませんね。

4

2 に答える 2

1
  1. 実際にObject#extendの定義を見てみると、 「パラメータとして与えられた各モジュールのインスタンスメソッドを obj に追加する」ことがわかります。内部的にはModule.extend_object、モジュールのインスタンス メソッドを呼び出して、Ruby オブジェクトのシングルトン クラスに追加します。

  2. Yield メソッドは受け取りません、それは... yields :-) Enumerable を機能させるために、eachメソッドはオブジェクトの連続した要素を生成する必要があります - そしてそれはまさにそれがすることです。このメソッドに次のようにブロックを渡す場合:

    countdown.each { |x| x}を置く

    出力として 3 2 1 が表示されます。Sort は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 に答える