August 1, 2017
This blog is part of our Ruby 2.4 series.
Prior to Ruby 2.4, if we were to dup an Integer, it would fail with a
TypeError.
> 1.dup
TypeError: can't dup Fixnum
from (irb):1:in `dup'
from (irb):1
This was confusing because Integer#dup is actually implemented.
> Integer.respond_to? :dup
=> true
However, if we were to freeze an Integer it would fail silently.
> 1.freeze
=> 1
Ruby 2.4 has now included dup-ability for Integer as well.
> 1.dup
=> 1
In Ruby, some object types are immediate variables and therefore cannot be duped/cloned. Yet, there was no graceful way of averting the error thrown by the sanity check when we attempt to dup/clone them.
So now Integer#dup functions exactly the way freeze does -- fail silently
and return the object itself. It makes sense because nothing about these objects
can be changed in the first place.
Follow @bigbinary on X. Check out our full blog archive.