A little thing about .to_str

Playing with Ruby’s === today and found some knowledge that’s share-worthy. I noticed in ruby docs for “string ===” a reference to “.to_str” and decided to investigate.

Nothing too exciting here, but its an important point of reference.

> hello = "hello"
> goodbye = "goodbye"
> hello === hello     #=> true
> hello === goodbye   #=> false

This is also what would usually be expected. Hang in there…

> string = "string"
> object = Object.new
> string + object     #=> TypeError no implicit conversion

Here’s where things get funky.

class SomeObjectWithToStr
  def to_str
    "is now a string"

> string = "string"
> object = SomeObjectWithToStr.new

> string + object     #=> "string is now a string"
> "string is now a string" === "string" + object      #=> true

Hunh? Why did that work?

TIL that .to_str is the default method call when operators force a conversion to a string. You’ll likely have to define it yourself. Also note that the object type on the left is what the object type on the right will try to convert into.

Do you know of any Objects that come with pre-defined .to_str methods?

Written on June 1, 2016 by ryanmagowan