たけ(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