Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does IRB use to determine how to represent a returned instance?

Tags:

class

ruby

irb

Given a Ruby class:

class Foo
  def initialize(options={})
    @sensitive = options.delete :sensitive
  end
end

If I create an instance of that class in IRB, I get to see instance vars and memory address.

irb(main):002:0> Foo.new(sensitive: 'foo')
=> #<Foo:0x007fe766134a98 @sensitive="foo">

If I create an instance of AWS::S3, I don't:

irb(main):003:0> require 'aws-sdk'
=> true
irb(main):004:0> AWS::S3.new(access_key_id: 'aki', secret_access_key: 'sak')
=> <AWS::S3>

Note that AWS::S3 is not a singleton (at least not in the sense of explicitly including the Singleton module).

Is there anything I can do to tell IRB not to output instance vars and/or memory address?

(I've already tried .to_s but I get a string containing the memory address for instances of both classes without any instance vars.)

like image 671
awendt Avatar asked Dec 28 '25 20:12

awendt


1 Answers

If you start IRB irb --noecho, it will suppress all IRB inspections. But I think this is not your question.

IRB use #inpect method. Read the line from the Documentation :

Returns a string containing a human-readable representation of obj. By default, show the class name and the list of the instance variables and their values (by calling inspect on each of them). User defined classes should override this method to make better representation of obj. When overriding this method, it should return a string whose encoding is compatible with the default external encoding.

Example :

class Foo
   def initialize
      @x = 10
   end
   # customized inspection
   def inspect
    "0x%7x" % self.object_id.to_s
   end
end

foo = Foo.new
foo # => 0x118e27c

Note : I used String#% method inside my customized #inspect method.

like image 159
Arup Rakshit Avatar answered Dec 30 '25 15:12

Arup Rakshit