BasicObject is the parent class of all classes in Ruby. It's an explicit blank class.
BasicObject can be used for creating object hierarchies independent of Ruby's object hierarchy, proxy objects like the Delegator class, or other uses where namespace pollution from Ruby's methods and classes must be avoided.
To avoid polluting BasicObject for other users an appropriately named subclass of BasicObject should be created instead of directly modifying BasicObject:
class MyObjectSystem < BasicObject
end
BasicObject does not include Kernel (for
methods like puts) and BasicObject is outside of the namespace of the
standard library so common classes will not be found without a using a full
class path.
A variety of strategies can be used to provide useful portions of the
standard library to subclasses of BasicObject. A subclass could include
Kernel to obtain puts, exit, etc. A
custom Kernel-like module could be created and included or delegation can
be used via method_missing:
class MyObjectSystem < BasicObject
DELEGATE = [:puts, :p]
def method_missing(name, *args, &block)
super unless DELEGATE.include? name
::Kernel.send(name, *args, &block)
end
def respond_to_missing?(name, include_private = false)
DELEGATE.include?(name) or super
end
end
Access to classes and modules from the Ruby standard library can be
obtained in a BasicObject subclass by
referencing the desired constant from the root like ::File or
::Enumerator. Like method_missing, const_missing can be used
to delegate constant lookup to Object:
class MyObjectSystem < BasicObject
def self.const_missing(name)
::Object.const_get(name)
end
end
- #
- E
- I
- N
Boolean negate.
Source: show
VALUE
rb_obj_not(VALUE obj)
{
return RTEST(obj) ? Qfalse : Qtrue;
}
Returns true if two objects are not-equal, otherwise false.
Source: show
VALUE
rb_obj_not_equal(VALUE obj1, VALUE obj2)
{
VALUE result = rb_funcall(obj1, id_eq, 1, obj2);
return RTEST(result) ? Qfalse : Qtrue;
}
Equality — At the Object level, == returns
true only if obj and other are the
same object. Typically, this method is overridden in descendant classes to
provide class-specific meaning.
Unlike ==, the equal? method should never be
overridden by subclasses as it is used to determine object identity (that
is, a.equal?(b) if and only if a is the same
object as b):
obj = "a"
other = obj.dup
a == other #=> true
a.equal? other #=> false
a.equal? a #=> true
The eql? method returns true if obj
and other refer to the same hash key. This is used by Hash to test members for equality. For objects of
class Object, eql? is synonymous with
==. Subclasses normally continue this tradition by aliasing
eql? to their overridden == method, but there are
exceptions. Numeric types, for example, perform type
conversion across ==, but not across eql?, so:
1 == 1.0 #=> true
1.eql? 1.0 #=> false
Source: show
VALUE
rb_obj_equal(VALUE obj1, VALUE obj2)
{
if (obj1 == obj2) return Qtrue;
return Qfalse;
}
Returns an integer identifier for obj.
The same number will be returned on all calls to id for a
given object, and no two active objects will share an id.
Object#object_id is a
different concept from the :name notation, which returns the
symbol id of name.
Replaces the deprecated Object#id.
Source: show
VALUE
rb_obj_id(VALUE obj)
{
/*
* 32-bit VALUE space
* MSB ------------------------ LSB
* false 00000000000000000000000000000000
* true 00000000000000000000000000000010
* nil 00000000000000000000000000000100
* undef 00000000000000000000000000000110
* symbol ssssssssssssssssssssssss00001110
* object oooooooooooooooooooooooooooooo00 = 0 (mod sizeof(RVALUE))
* fixnum fffffffffffffffffffffffffffffff1
*
* object_id space
* LSB
* false 00000000000000000000000000000000
* true 00000000000000000000000000000010
* nil 00000000000000000000000000000100
* undef 00000000000000000000000000000110
* symbol 000SSSSSSSSSSSSSSSSSSSSSSSSSSS0 S...S % A = 4 (S...S = s...s * A + 4)
* object oooooooooooooooooooooooooooooo0 o...o % A = 0
* fixnum fffffffffffffffffffffffffffffff1 bignum if required
*
* where A = sizeof(RVALUE)/4
*
* sizeof(RVALUE) is
* 20 if 32-bit, double is 4-byte aligned
* 24 if 32-bit, double is 8-byte aligned
* 40 if 64-bit
*/
if (SYMBOL_P(obj)) {
return (SYM2ID(obj) * sizeof(RVALUE) + (4 << 2)) | FIXNUM_FLAG;
}
else if (FLONUM_P(obj)) {
#if SIZEOF_LONG == SIZEOF_VOIDP
return LONG2NUM((SIGNED_VALUE)obj);
#else
return LL2NUM((SIGNED_VALUE)obj);
#endif
}
else if (SPECIAL_CONST_P(obj)) {
return LONG2NUM((SIGNED_VALUE)obj);
}
return nonspecial_obj_id(obj);
}
Invokes the method identified by symbol, passing it any arguments
specified. You can use __send__ if the name send
clashes with an existing method in obj.
class Klass
def hello(*args)
"Hello " + args.join(' ')
end
end
k = Klass.new
k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
Source: show
VALUE
rb_f_send(int argc, VALUE *argv, VALUE recv)
{
return send_internal(argc, argv, recv, CALL_FCALL);
}
Equality — At the Object level, == returns
true only if obj and other are the
same object. Typically, this method is overridden in descendant classes to
provide class-specific meaning.
Unlike ==, the equal? method should never be
overridden by subclasses as it is used to determine object identity (that
is, a.equal?(b) if and only if a is the same
object as b):
obj = "a"
other = obj.dup
a == other #=> true
a.equal? other #=> false
a.equal? a #=> true
The eql? method returns true if obj
and other refer to the same hash key. This is used by Hash to test members for equality. For objects of
class Object, eql? is synonymous with
==. Subclasses normally continue this tradition by aliasing
eql? to their overridden == method, but there are
exceptions. Numeric types, for example, perform type
conversion across ==, but not across eql?, so:
1 == 1.0 #=> true
1.eql? 1.0 #=> false
Source: show
VALUE
rb_obj_equal(VALUE obj1, VALUE obj2)
{
if (obj1 == obj2) return Qtrue;
return Qfalse;
}
Evaluates a string containing Ruby source code, or the given block, within
the context of the receiver (obj). In order to set the context,
the variable self is set to obj while the code is
executing, giving the code access to obj's instance variables.
In the version of instance_eval that takes a
String, the optional second and third parameters supply a
filename and starting line number that are used when reporting compilation
errors.
class KlassWithSecret
def initialize
@secret = 99
end
end
k = KlassWithSecret.new
k.instance_eval { @secret } #=> 99
Source: show
VALUE
rb_obj_instance_eval(int argc, VALUE *argv, VALUE self)
{
VALUE klass;
if (SPECIAL_CONST_P(self)) {
klass = rb_special_singleton_class(self);
}
else {
klass = rb_singleton_class(self);
}
return specific_eval(argc, argv, klass, self);
}
Executes the given block within the context of the receiver (obj).
In order to set the context, the variable self is set to
obj while the code is executing, giving the code access to
obj's instance variables. Arguments are passed as block
parameters.
class KlassWithSecret
def initialize
@secret = 99
end
end
k = KlassWithSecret.new
k.instance_exec(5) {|x| @secret+x } #=> 104
Source: show
VALUE
rb_obj_instance_exec(int argc, VALUE *argv, VALUE self)
{
VALUE klass;
if (SPECIAL_CONST_P(self)) {
klass = rb_special_singleton_class(self);
}
else {
klass = rb_singleton_class(self);
}
return yield_under(klass, self, rb_ary_new4(argc, argv));
}