たけ(tk)です

こんなふうに考えてもよいでしょうか?

> f2.baz              # => "Poo.bar(7,8)"

の時点でレシーバを指定して呼び出したので、レシーバが f2(#<Foo:0x82da890>)
に変わる。

>   def baz
>     hello(3,4)      # => "Foo#bar(3,4)"

では、レシーバは #<Foo:0x82da890> のままで、そこには helloメソッドは見つ
からないので、グローバルな hello が呼び出される。しかし、レシーバを省略
して hello を呼び出したので、レシーバは変わらない。

> def hello(c,d)
>   # globalのbarではなくFoo#barが呼ばれる
>   # Object#helloは二度呼ばれているので「=> 1回目の値, 2回目の値」と注釈されている
>   self              # => #<Foo:0x82da890>, main
>   bar(c,d)          # => "Foo#bar(3,4)", "global bar(1,2)"
> end

グローバルな helloの内部でのレシーバも、 #<Foo:0x82da890> のままである。
#<Foo:0x82da890> の内部で bar メソッドを捜すと Foo#bar が見つかるので、
それが呼ばれる。

それに対して、

>   def baz
>     hello(3,4)      # => "Foo#bar(3,4)"
>     Poo.hello(7,8)  # => "Poo.bar(7,8)"

の2番目の Poo.hello では、レシーバつきで呼び出しているので、レシーバは 
Poo クラスに変更される。

> class Poo
>   def self.bar(i,j)
>     "Poo.bar(#{i},#{j})"
>   end
>   def self.hello(g,h)
>     # Poo.barが呼ばれる
>     bar(g,h)        # => "Poo.bar(7,8)"
>   end
> end

レシーバである Pooクラスの中から bar メソッドを捜すと見つかるので、それ
(Poo.bar)を呼び出す。

Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武