类的类.严密的说就是,各个类都有一个无名的元类,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