class Class

[edit]

要約

クラスのクラスです。

より正確に言えば、個々のクラスはそれぞれメタクラスと呼ばれる名前のないクラスをクラスとして持っていて、Class はそのメタクラスのクラスです。この関係は少し複雑ですが、Ruby を利用するにあたっては特に重要ではありません。

クラスとモジュールには

という違いがありますが、それ以外のほとんどの機能は Module から継承されています。Module のメソッドのうち

は Class では未定義にされています。

目次

特異メソッド
インスタンスメソッド
privateメソッド

継承しているメソッド

Moduleから継承しているメソッド

特異メソッド

new(superclass = Object) -> Class[permalink][rdoc][edit]
new(superclass = Object) {|klass| ... } -> Class

新しく名前の付いていない superclass のサブクラスを生成します。

名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。



p foo = Class.new   # => #<Class:0x401b90f8>
p foo.name          # => nil
Foo = foo           # ここで p foo すれば "Foo" 固定
Bar = foo
p foo.name          # => "Bar"  ("Foo" になるか "Bar" になるかは不定)

ブロックが与えられた場合、生成したクラスを引数としてクラスのコンテキストでブロックを実行します。以下のコードと同じです。



klass = Class.new(superclass)
klass.module_eval {|m|
  # ...
}
klass

この場合も生成したクラスを返します。ブロックの実行は Class#initialize が行います。

[PARAM] superclass:
生成するクラスのスーパークラスを指定します。


k = Class.new{|c|
  def initialize
    p "in initialize"
  end

  def hoge
    p "hoge hoge hoge"
  end
}
o = k.new              #=> "in initialize"
o.hoge                 #=> "hoge hoge hoge"

インスタンスメソッド

_load(str) -> Class[permalink][rdoc][edit]

Object#_dump を参照して下さい。

[PARAM] str:
Ruby のオブジェクトがダンプされた文字列を指定します。
allocate -> object[permalink][rdoc][edit]

自身のインスタンスを生成して返します。生成したオブジェクトは自身のインスタンスであること以外には何も特性を持ちません。



klass = Class.new do
  def initialize(*args)
    @initialized = true
  end

  def initialized?
    @initialized || false
  end
end

klass.allocate.initialized? #=> false
new(*args, &block) -> object[permalink][rdoc][edit]

自身のインスタンスを生成して返します。このメソッドの引数はブロック引数も含め Object#initialize に渡されます。

new は Class#allocate でインスタンスを生成し、 Object#initialize で初期化を行います。

[PARAM] args:
Object#initialize に渡される引数を指定します。
[PARAM] block:
Object#initialize に渡されるブロックを指定します。


# [[c:Class]] クラスのインスタンス、C クラスを生成
C = Class.new   # => C

# [[c:Class]] クラスのインスタンス、C クラスのインスタンスを生成
C.new           # => #<C:0x00005623f8b4e458>
subclasses -> [Class][permalink][rdoc][edit]

自身が直接のスーパークラスになっている(特異クラスを除く)クラスの配列を返します。返り値の配列の順序は未定義です。



class A; end
class B < A; end
class C < B; end
class D < A; end

A.subclasses        # => [D, B]
B.subclasses        # => [C]
C.subclasses        # => []

[SEE_ALSO] Class#superclass

superclass -> Class | nil[permalink][rdoc][edit]

自身のスーパークラスを返します。



File.superclass          #=> IO
IO.superclass            #=> Object
class Foo; end
class Bar < Foo; end
Bar.superclass           #=> Foo
Object.superclass        #=> BasicObject

ただし BasicObject.superclass は nil を返します。



BasicObject.superclass   #=> nil

[SEE_ALSO] Class#subclasses

privateメソッド

inherited(subclass) -> ()[permalink][rdoc][edit]

クラスのサブクラスが定義された時、新しく生成されたサブクラスを引数にインタプリタから呼び出されます。このメソッドが呼ばれるタイミングはクラス定義文の実行直前です。

[PARAM] subclass:
プログラム内で新たに定義された自身のサブクラスです。


class Foo
  def Foo.inherited(subclass)
    puts "class \"#{self}\" was inherited by \"#{subclass}\""
  end
end
class Bar < Foo
  puts "executing class body"
end

# => class "Foo" was inherited by "Bar"
#    executing class body