[#45318] Windows コマンドプロンプトで UTF-8を出力するには — Yuumi Yoshida <yuumi3@...>

おつかれさまです、 Yuumi3です。

11 messages 2008/08/08

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

From: take_tk <ggb03124@...>
Date: 2008-08-06 17:46:37 UTC
List: ruby-list #45307
たけ(tk)です。

結局、るびきちさんの説明を同じになっちゃいましたね。

ポイントは

(1)トップレベルで定義されたメソッドは Objectクラスの関数型メソッド
(selfを付加することが禁止されたメソッド)となる。

(2)Objectクラスはすべてのクラスの上位クラスなので、或るクラスαのメソッ
ドAから、トップレベルで定義したメソッドBを呼び出すと、上位クラスのメソッ
ドとして、呼び出すことができる。

というのはよいとして、問題は、

(3)レシーバを省略してメソッドを呼び出すと、その時点での self がレシー
バとなる。

(4)呼び出されたメソッドの内部での self は呼び出し時のレシーバである。

というルールが加わるので、

(5)或るクラスαのメソッドAからトップレベルで定義されたメソッドBを呼
び出すと、呼び出されたメソッドBの内部での self は、トップレベル(main)
ではなく、呼び出したメソッドAでの self と同じになる。

(6)なので、トップレベルのメソッドBからトップレベルの別のメソッドCを
呼び出すように書いてあっても、呼び出したメソッドAのクラスαやその上位ク
ラス(Objectにいたる前の上位クラス)に同名のメソッドがある場合には、トッ
プレベルのメソッドCは呼び出されれないことになる。

(あってますかね?)

−−−−

ちなみに、クラスメソッドでも同様です。ClassもObjectの継承クラスなので。

def bar(e,f)
  "global bar(#{e},#{f})"
end

def hello(c,d)
  p self      #=> Poo # hello が Poo.baz から呼ばれたときの self は Poo
  bar(c,d)    #=> hello が Poo.baz から呼ばれたときには Poo.bar を呼び出す。
end

class Poo
  def self.bar(i,j)
    "Poo.bar(#{i},#{j})"
  end
  def self.baz
    hello(3,4)
  end
end

p Poo.baz           # => "Poo#bar(3,4)"

take_tk = kumagai hidetake

In This Thread