Class: Object
- Inherits:
- BasicObject
- Defined in:
- lib/chewy/backports/duplicable.rb,
lib/chewy/backports/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
-
#deep_dup ⇒ Object
Returns a deep copy of object if it's duplicable.
-
#duplicable? ⇒ Boolean
Can you safely dup this object?.
Instance Method Details
#deep_dup ⇒ Object
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
13 14 15 |
# File 'lib/chewy/backports/deep_dup.rb', line 13 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.
24 25 26 |
# File 'lib/chewy/backports/duplicable.rb', line 24 def duplicable? true end |