Class: Object

Inherits:
BasicObject
Defined in:
lib/backports/active_support/duplicable.rb,
lib/backports/active_support/deep_dup.rb

Overview

Most objects are cloneable, but not all. For example you can't dup +nil+:

nil.dup # => TypeError: can't dup NilClass

Classes may signal their instances are not duplicable removing +dup+/+clone+ or raising exceptions from them. So, to dup an arbitrary object you normally use an optimistic approach and are ready to catch an exception, say:

arbitrary_object.dup rescue object

Rails dups objects in a few critical spots where they are not that arbitrary. That rescue is very expensive (like 40 times slower than a predicate), and it is often triggered.

That's why we hardcode the following cases and check duplicable? instead of using that rescue idiom. ++

Instance Method Summary collapse

Instance Method Details

#deep_dupObject

Returns a deep copy of object if it's duplicable. If it's not duplicable, returns +self+.

object = Object.new dup = object.deep_dup dup.instance_variable_set(:@a, 1)

object.instance_variable_defined?(:@a) #=> false dup.instance_variable_defined?(:@a) #=> true



16
17
18
# File 'lib/backports/active_support/deep_dup.rb', line 16

def deep_dup
  duplicable? ? dup : self
end

#duplicable?Boolean

Can you safely dup this object?

False for +nil+, +false+, +true+, symbol, and number objects; true otherwise.



27
28
29
# File 'lib/backports/active_support/duplicable.rb', line 27

def duplicable?
  true
end