In Ruby, what's the difference between String() and #to_s

coding-style, ruby

Solution

The docs for the `String` method say:

Converts arg to a String by calling its to_s method.

So generally they are the same, but there are some differences – although you’re unlikely to see them for real. `String()` checks the class of its parameter, and if it’s not already a `String` then calls `to_s` on it. Calling `to_s` directly means the method is called regardless.

Consider the class:

class MyString < String
  def to_s
    "Overridden to_s method"
  end
end

An instance of `MyString` is already a `String` object, so passing it as a parameter to `String()` won’t do anything. Calling `to_s` on it will however return `Overridden to_s method`.

1.9.3p286 :010 > m = MyString.new 'my string'
 => "my string" 
1.9.3p286 :011 > o = String.new 'orig string'
 => "orig string" 
1.9.3p286 :012 > String o
 => "orig string" 
1.9.3p286 :013 > String m
 => "my string" 
1.9.3p286 :014 > o.to_s
 => "orig string" 
1.9.3p286 :015 > m.to_s
 => "Overridden to_s method" 

You’re unlikely ever to need to override `to_s` on a `String` subclass like this, in general you can treat `String()` and `to_s` as the same, but it might be useful to know what’s going on.

Problem

``` String(1.1) == (1.1).to_s => true String(1.1) === (1.1).to_s => true ``` Is there a difference between these two coercion methods? If so, can you demonstrate?

Original source

Related problems