Class

类的类.严密的说就是,各个类都有一个无名的元类,Class就是该元类的类.这种关系有些难以理解,但这并不妨碍您使用Ruby.

类和模块有以下差别

除此以外的大部分功能都继承于Module. Module中的下列方法

Class中是尚未定义的.

超类:

类方法:

Class.new([superclass])
Class.new([superclass]) {|klass| ... }

新生成一个无名的superclass的子类. 若省略superclass则生成Object的子类.

首次访问无名类的类名时, 将会搜索已赋值的常数名,然后把找到的常数名当做类名.

p foo = Class.new   # => #<Class:0x401b90f8>
p foo.name          # => ""
Foo = foo           # 此处若是 p foo 的话,类名就是 "Foo" 了
Bar = foo
p foo.name          # => "Bar"  (可能是"Foo",也可能是"Bar")

ruby 1.7 特性: 若带块的话,会把新生成的类传给块参数,然后在类的context中执行该块. 此时也是返回生成的类. 这等同于

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

执行块的同时会进行 Module#initialize .

方法:

allocate ((<ruby 1.7 特性>))

生成并返回类的实例. (通常情况下)生成的对象就只是类的实例而已,没有什么其他特性.

new( ... )

生成并返回类的实例. 该方法的参数,包括块参数在内,都会被传给initialize.

ruby 1.7 特性: 在version 1.7中,new方法使用allocate来生成实例,使用initialize来完成初始化.

superclass

返回类的超类.

私有方法:

inherited(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