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.