El módulo ObjectSpace contiene métodos que permiten atravesar los objetos existentes::
>> ObjectSpace.each_object(Numeric) { |x| p x } 2.71828182845905 3.14159265358979 9223372036854775807 95166617196965824296817888526506730120332022876053991446234245250621584887778 2.22044604925031e-16 1.79769313486232e+308 2.2250738585072e-308 0 0 95.1 102.5 => 11
>> Float::MAX => 1.79769313486232e+308 >> Float::EPSILON => 2.22044604925031e-16 >> Math::PI => 3.14159265358979 >> Math::E => 2.71828182845905El módulo ObjectSpace no accede a los objetos con valores inmediatos: Fixnum, Symbol,
true
,
false
y
nil
:
>> a = 102 => 102 >> a.class => Fixnum >> b = 95 => 95 >> ObjectSpace.each_object(Numeric) { |x| p x } 2.71828182845905 3.14159265358979 9223372036854775807 97997521621253453151246418904344427109054468668812181388822276467821973581887 2.22044604925031e-16 1.79769313486232e+308 2.2250738585072e-308 0 0 => 9 >>Obsérvese que
ObjectSpace.each_object(Class)
nos pasa el objeto, no el nombre del objeto:
>> ObjectSpace.each_object(Numeric) { |x| p x.class } Float Float Bignum Bignum Float Float Float Bignum Bignum => 9 >>
Podemos inspeccionar los nombres de los
métodos de un objeto usando methods
:
>> r = 1..10 => 1..10 >> x = r.methods => ["find", "inspect", ..., "include?", "is_a?", "all?"] >> x.length => 94
>> x.index("first") => 53 >> w = x[53] => "first"
>> m = r.method w => #<Method: Range#first> >> m.arity => 0 >> r.send(w) => 1
>> m.call => 1 >> m.call() => 1 >> m[] => 1 >>
Casiano Rodriguez León 2015-01-07