たけ(tk)です。
[ruby-list:45302] Re: グローバルにdefしたメソッドのスコープ にて
take_tk <ggb03124@xxxxx> さん 曰く:
> > 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