たけ(tk)です。

[ruby-list:45302] Re: グローバルにdefしたメソッドのスコープ にて 
take_tk <ggb03124 / nifty.com> さん 曰く:

> >   def baz
> >     hello(3,4)      # => "Foo#bar(3,4)"
> 
> では、レシーバは #<Foo:0x82da890> のままで、そこには helloメソッドは見つ
> からないので、グローバルな hello が呼び出される。しかし、レシーバを省略
> して hello を呼び出したので、レシーバは変わらない。
  ↓
ここでの、self は #<Foo:0x82da890> である。helloメソッドは Fooクラスには
見つからないので、上位クラスのhelloメソッドを捜して、グローバルなメソッ
ド(Object#hello)が呼び出される。ところで、レシーバを省略すると、selfが
メソッドのレシーバとなる。従って、ここでの self #<Foo:0x82da890> が、グ
ローバルな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 が見つかるので、
> それが呼ばれる。
  ↓
グローバルなhelloメソッドが #<Foo:0x82da890> をレシーバとして呼び出され
たので、グローバルな helloの内部での self は #<Foo:0x82da890> である。・
・・

take_tk = kumagai hidetake