Class: Class
Overview
Classes in Ruby are first-class objects---each is an instance of class Class
.
When a new class is created (typically using class Name ... end
), an object of type Class
is created and assigned to a global constant (Name
in this case). When Name.new
is called to create a new object, the new
method in Class
is run by default. This can be demonstrated by overriding new
in Class
:
class Class
alias oldNew new
def new(*args)
print "Creating a new ", self.name, "\n"
oldNew(*args)
end
end
class Name
end
n = Name.new
produces:
Creating a new Name
Classes, modules, and objects are interrelated. In the diagram that follows, the vertical arrows represent inheritance, and the parentheses meta-classes. All metaclasses are instances of the class 'Class'.
+---------+ +-...
| | |
BasicObject-----|-->(BasicObject)-------|-...
^ | ^ |
| | | |
Object---------|----->(Object)---------|-...
^ | ^ |
| | | |
+-------+ | +--------+ |
| | | | | |
| Module-|---------|--->(Module)-|-...
| ^ | | ^ |
| | | | | |
| Class-|---------|---->(Class)-|-...
| ^ | | ^ |
| +---+ | +----+
| |
obj--->OtherClass---------->(OtherClass)-----------...
Instance Method Summary collapse
-
#allocate ⇒ Object
Allocates space for a new object of class's class and does not call initialize on the new instance.
-
#inherited(subclass) ⇒ Object
Callback invoked whenever a subclass of the current class is created.
-
#new ⇒ Object
constructor
Returns a new BasicObject.
-
#initialize_copy ⇒ Object
:nodoc:.
-
#new(args, ...) ⇒ Object
Calls
allocate
to create a new object of class's class, then invokes that object'sinitialize
method, passing it args. -
#superclass ⇒ nil
Returns the superclass of class, or
nil
.
Methods inherited from Module
#<, #<=, #<=>, #==, #===, #>, #>=, #alias_method, #ancestors, #append_features, #attr, #attr_accessor, #attr_reader, #attr_writer, #autoload, #autoload?, #class_eval, #class_exec, #class_variable_defined?, #class_variable_get, #class_variable_set, #class_variables, #const_defined?, #const_get, #const_missing, #const_set, constants, #constants, #define_method, #extend_object, #extended, #freeze, #include, #include?, #included, #included_modules, #instance_method, #instance_methods, #method_added, #method_defined?, #method_removed, #method_undefined, #module_eval, #module_exec, #module_function, #name, nesting, #private, #private_class_method, #private_constant, #private_instance_methods, #private_method_defined?, #protected, #protected_instance_methods, #protected_method_defined?, #public, #public_class_method, #public_constant, #public_instance_method, #public_instance_methods, #public_method_defined?, #remove_class_variable, #remove_const, #remove_method, #to_s, #undef_method
Constructor Details
#new ⇒ Object
Returns a new BasicObject.
|
# File 'object.c'
/*
* call-seq:
* Class.new(super_class=Object) -> a_class
* Class.new(super_class=Object) { |mod| ... } -> a_class
*
* Creates a new anonymous (unnamed) class with the given superclass
* (or <code>Object</code> if no parameter is given). You can give a
* class a name by assigning the class object to a constant.
*
* If a block is given, it is passed the class object, and the block
* is evaluated in the context of this class using
* <code>class_eval</code>.
*
* fred = Class.new do
* def meth1
* "hello"
* end
* def meth2
* "bye"
* end
* end
*
* a = fred.new #=> #<#<Class:0x100381890>:0x100376b98>
* a.meth1 #=> "hello"
* a.meth2 #=> "bye"
*
* Assign the class to a constant (name starting uppercase) if you
* want to treat it like a regular class.
*/
static VALUE
rb_class_initialize(int argc, VALUE *argv, VALUE klass)
{
VALUE super;
if (RCLASS_SUPER(klass) != 0 || klass == rb_cBasicObject) {
rb_raise(rb_eTypeError, "already initialized class");
}
|
Instance Method Details
#allocate ⇒ Object
Allocates space for a new object of class's class and does not call initialize on the new instance. The returned object must be an instance of class.
klass = Class.new do
def initialize(*args)
@initialized = true
end
def initialized?
@initialized || false
end
end
klass.allocate.initialized? #=> false
|
# File 'object.c'
VALUE
rb_obj_alloc(VALUE klass)
{
VALUE obj;
if (RCLASS_SUPER(klass) == 0 && klass != rb_cBasicObject) {
rb_raise(rb_eTypeError, "can't instantiate uninitialized class");
}
|
#inherited(subclass) ⇒ Object
Callback invoked whenever a subclass of the current class is created.
Example:
class Foo
def self.inherited(subclass)
puts "New subclass: #{subclass}"
end
end
class Bar < Foo
end
class Baz < Bar
end
produces:
New subclass: Bar
New subclass: Baz
|
# File 'object.c'
/*
* Not documented
*/
static VALUE
rb_obj_dummy(void)
{
return Qnil;
}
|
#initialize_copy ⇒ Object
:nodoc:
|
# File 'object.c'
VALUE
rb_class_init_copy(VALUE clone, VALUE orig)
{
if (orig == rb_cBasicObject) {
rb_raise(rb_eTypeError, "can't copy the root class");
}
|
#new(args, ...) ⇒ Object
Calls allocate
to create a new object of class's class, then invokes that object's initialize
method, passing it args. This is the method that ends up getting called whenever an object is constructed using .new.
|
# File 'object.c'
VALUE
rb_class_new_instance(int argc, VALUE *argv, VALUE klass)
{
VALUE obj;
obj = rb_obj_alloc(klass);
rb_obj_call_init(obj, argc, argv);
return obj;
}
|
#superclass ⇒ nil
Returns the superclass of class, or nil
.
File.superclass #=> IO
IO.superclass #=> Object
Object.superclass #=> BasicObject
class Foo; end
class Bar < Foo; end
Bar.superclass #=> Foo
returns nil when the given class hasn't a parent class:
BasicObject.superclass #=> nil
|
# File 'object.c'
VALUE
rb_class_superclass(VALUE klass)
{
VALUE super = RCLASS_SUPER(klass);
if (!super) {
if (klass == rb_cBasicObject) return Qnil;
rb_raise(rb_eTypeError, "uninitialized class");
}
|