# Which methods does "puts" invoke?

**URL:** <https://www.ruby-forum.com/t/which-methods-does-puts-invoke/164290>\
**Category:** Ruby\
**Created:** [March 30, 2009, 11:17pm UTC](https://www.ruby-forum.com/t/which-methods-does-puts-invoke/164290 "2009-03-30T23:17:27Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [March 30, 2009, 11:17pm UTC](https://www.ruby-forum.com/t/which-methods-does-puts-invoke/164290/1 "2009-03-30T23:17:27Z")

</div>

Hi, if I redefine “to\_s” or “inspect” methods in String class I still  
get the  
original output when doing:

puts string

Which String@method is invoked when executing “puts”?

Thanks.

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [March 30, 2009, 11:35pm UTC](https://www.ruby-forum.com/t/which-methods-does-puts-invoke/164290/2 "2009-03-30T23:35:36Z")

</div>

Iñaki Baz C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> Hi, if I redefine “to\_s” or “inspect” methods in String class I still get the  
> original output when doing:
> 
> puts string
> 
> Which String@method is invoked when executing “puts”?

to\_s (inspect is called by p)

> > class Truc  
> > end  
> > =\> nil  
> > machin = Truc.new  
> > =\> #Truc:0x55604  
> > puts machin  
> > #Truc:0x55604  
> > =\> nil  
> > class Truc  
> > def to\_s  
> > “to\_s called”  
> > end  
> > end  
> > =\> nil  
> > puts machin  
> > to\_s called  
> > =\> nil

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [March 30, 2009, 11:45pm UTC](https://www.ruby-forum.com/t/which-methods-does-puts-invoke/164290/3 "2009-03-30T23:45:34Z")

</div>

On Mon, Mar 30, 2009 at 4:16 PM, Iñaki Baz C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Hi, if I redefine “to\_s” or “inspect” methods in String class I still get the  
> original output when doing:
> 
> puts string
> 
> Which String@method is invoked when executing “puts”?

Based on my cursory inspection of the internals (in io.c) it doesn’t  
appear that puts() is actually calling any of String’s methods, at  
least not in any way that you can override them.

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [March 30, 2009, 11:54pm UTC](https://www.ruby-forum.com/t/which-methods-does-puts-invoke/164290/4 "2009-03-30T23:54:20Z")

</div>

El Lunes 30 Marzo 2009, Eric J.  
escribió:\> \>\> class Truc

> #Truc:0x55604
> 
> > > puts machin
> 
> to\_s called  
> =\> nil

Well, I already tested it, and yes, it seems to work if you define to\_s  
method  
in some custom class, but note the following:

* * *

class String  
def to\_s  
“hiiiiiii”  
end  
end

# s=String.new(“qweqwe”)

# puts s

## qweqwe nil

¿?

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [March 31, 2009, 12:35am UTC](https://www.ruby-forum.com/t/which-methods-does-puts-invoke/164290/5 "2009-03-31T00:35:54Z")

</div>

Iñaki Baz C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> ## nil

Oh yes, you’re right… puts doesn’t use to\_s when called on a String.

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [March 31, 2009, 1:35am UTC](https://www.ruby-forum.com/t/which-methods-does-puts-invoke/164290/6 "2009-03-31T01:35:34Z")

</div>

On Mar 30, 2:16 pm, Iñaki Baz C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Iñaki Baz C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> From the rdoc of IO#puts ([http://www.ruby-doc.org/core-1.8.7/classes/](http://www.ruby-doc.org/core-1.8.7/classes/)  
> IO.html#M000474) it states that puts “writes the given objects to ios  
> as with IO#print”. So puts calls print.

Further, the rdoc for IO#print ssays that objects passed to it “that  
aren‘t strings will be converted by calling their to\_s method.”

---

<div class="post-metadata">

**Author:** ![ISSSSaki\_Baz\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/i/51bf81/32.png) [@ISSSSaki\_Baz\_C](https://www.ruby-forum.com/u/ISSSSaki_Baz_C)\
**Post date:** [March 31, 2009, 11:03am UTC](https://www.ruby-forum.com/t/which-methods-does-puts-invoke/164290/7 "2009-03-31T11:03:12Z")

</div>

Eric J. wrote:

> Oh yes, you’re right… puts doesn’t use to\_s when called on a String.

Nor on nil. (It prints “nil”, whereas nil.to\_s is the empty string)
