Getting Object#inspect back

Hello everybody,

Not that I despreately need it, but I was wondering how to e.g. get the
Object#inspect method back for some classes which override it, say just
as an example for a Hash?

Neither option I considered seems suitable:

alias_method --- too late, the original method is gone
instance_eval --- didn't work for me
using .method and .call --- I never seemed to link the objects self to
the Object#inspect method

I am sure it is very easy...
   Oliver

This is tricky, because Object#inspect calls to_s.
You need to copy both.

class Foo < Hash
    define_method(:inspect, Object.instance_method(:inspect))
    define_method(:to_s, Object.instance_method(:to_s))
end

a = Foo.new
p a # => #<Foo:0xb7d26d2c>

If you want to keep Hash to_s (but why would anyone want that)
you can do:

class Foo < Hash
    define_method(:inspect, Object.instance_method(:to_s))
end

···

On 10/12/06, OliverMarchand <oliver.marchand@gmail.com> wrote:

Hello everybody,

Not that I despreately need it, but I was wondering how to e.g. get the
Object#inspect method back for some classes which override it, say just
as an example for a Hash?

Neither option I considered seems suitable:

alias_method --- too late, the original method is gone
instance_eval --- didn't work for me
using .method and .call --- I never seemed to link the objects self to
the Object#inspect method

--
Tomasz Wegrzanowski [ http://t-a-w.blogspot.com/ ]

Hi --

Hello everybody,

Not that I despreately need it, but I was wondering how to e.g. get the
Object#inspect method back for some classes which override it, say just
as an example for a Hash?

Neither option I considered seems suitable:

alias_method --- too late, the original method is gone
instance_eval --- didn't work for me
using .method and .call --- I never seemed to link the objects self to
the Object#inspect method

I am sure it is very easy...

super might be adequate:

   def inspect
     super
   end

unless there are multiple overridings along the way, in which case you
might need:

   Object.instance_method(:inspect).bind(self).call

David

···

On Thu, 12 Oct 2006, OliverMarchand wrote:

--
                   David A. Black | dblack@wobblini.net
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] Ruby for Rails | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org

>Not that I despreately need it, but I was wondering how to e.g. get the
>Object#inspect method back for some classes which override it, say just
>as an example for a Hash?
>

[...]

super might be adequate:

[...]

unless there are multiple overridings along the way, in which case you
might need:

  Object.instance_method(:inspect).bind(self).call

It's not enough in this case because there's an explicit check in
rb_obj_inspect that will make it use #to_s if the object is not a "regular
one" (i.e. not Array, Hash, File, etc. nor derived classes):

    static VALUE
    rb_obj_inspect(VALUE obj)
    {
  if (TYPE(obj) == T_OBJECT
      && ROBJECT(obj)->iv_tbl
      && ROBJECT(obj)->iv_tbl->num_entries > 0) {
  /* .... */
  }
  return rb_funcall(obj, rb_intern("to_s"), 0, 0);
    }

So even if you rebind Object#inspect, it won't do what the OP wanted, but you
can rebind Object#to_s:

    a = {}
    a.inspect # => "{}"
    ins = lambda{|o| Object.instance_method(:to_s).bind(o).call }
    ins[a] # => "#<Hash:0xa7dc63cc>"
    ins[] # => "#<Array:0xa7dc6200>"
    ins[Object.new] # => "#<Object:0xa7dc60fc>"

e.g.

    class Hash; define_method(:inspect, Object.instance_method(:to_s)) end
    {} # => #<Hash:0xa7ddec38>

However, Object#to_s doesn't display instance variables the way Object#inspect
does:

    a = {}
    ins = lambda{|o| Object.instance_method(:to_s).bind(o).call }
    a.instance_variable_set :@a, 1
    ins[a] # => "#<Hash:0xa7d93490>"
    o = Object.new
    o.instance_variable_set :@a, 1
    o.inspect # => "#<Object:0xa7d93364 @a=1>"
    ins[o] # => "#<Object:0xa7d93364>"

so you'd have to implement another inspect, with recursivity checks and
everything, if you want to imitate Object#inspect.

···

On Thu, Oct 12, 2006 at 11:07:42PM +0900, dblack@wobblini.net wrote:

--
Mauricio Fernandez - http://eigenclass.org - singular Ruby