2008年8月 7日

[ruby-list:45306] Re: グローバルにdefしたメソッドのスコープ

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


投稿者 xml-rpc : 2008年8月 7日 02:05
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/76023
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。