かんだです。

Re the message of ``[ruby-list:19114] Class::name or foo.name?''...

h-isikaw / nims.nec.co.jp:
> いしかわ@NIMSです。
> 
>  クラスClassのメソッドnameはクラスメソッドなのでしょうか?
> マニュアル(http://www.ruby-lang.org/ja/man-1.4/Class.html)には
> そうでないように書いてありますが、試してみるとクラスメソッドの
> ように動作します。

> % ruby -v
> ruby 1.4.2 (1999-09-18) [sparc-solaris2.6]
> % cat testClassMethod.rb 
> class Foo
> end
> 
> foo = Foo.new
> print "Foo.name[#{Foo.name()}]\n"
> print "foo.name[#{foo.name()}]\n"
> % ruby testClassMethod.rb
> Foo.name[Foo]
> testClassMethod.rb:6: undefined method `name' for #<Foo:0xda620> (NameError)

  いえ、これでいいんです。
# 正確には Class でなく Module ですが、ここでは同じと考えときますね。

  foo はクラスFoo のインスタンスであって、クラスClass のインスタンスでは
ありません。また、Ruby では Foo はリテラルでなくてオブジェクトになってい
て、こちらはクラスClass のインスタンスです。

  class Foo; end; p Foo.type
  foo = Foo::new; p foo.type
->
  Class
  Foo

  継承関係と、クラス・インスタンス関係は別に考えましょう。
  Object は Class のインスタンスであり、Class は Object のサブクラスです。

  インスタンスメソッドはそのクラスのインスタンスが使えるメソッドです。
  name は クラスClass のインスタンスメソッドですので、Classのインスタンス
である Foo から使えるわけです(Fooのインスタンス foo ではなく)。
  Foo から呼び出せるのはいわゆるクラスFooのクラスメソッドとも言えますが、
これは Foo 以外の Classインスタンス(例えば String)でも同様に使えるので、
Class(Module) のところに説明してあるわけですね。
  ちなみに Foo に特異メソッドを定義すると、それは Foo からしか呼ばれなく
なりますので、Foo のクラスメソッドのようになります。

  ここのところは難しいですよね(^^; 説明もややこしいぞ。

-- 
  だい@楓街           
    MAP2303 / mapletown.net                  紅玉軌道異変アリ。