Most objects are cloneable, but not all. For example you can’t dup
nil:
nil.dup
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.
Aliases
Show files where this class is defined (12 files)
activesupport/lib/active_support/core_ext/kernel/agnostics.rb
activesupport/lib/active_support/core_ext/object/acts_like.rb
activesupport/lib/active_support/core_ext/object/duplicable.rb
activesupport/lib/active_support/core_ext/object/to_query.rb
activesupport/lib/active_support/core_ext/object/with_options.rb
activesupport/lib/active_support/core_ext/object/blank.rb
activesupport/lib/active_support/core_ext/object/instance_variables.rb
activesupport/lib/active_support/core_ext/object/to_param.rb
activesupport/lib/active_support/core_ext/object/returning.rb
activesupport/lib/active_support/core_ext/object/try.rb
activesupport/lib/active_support/core_ext/string/output_safety.rb
activesupport/lib/active_support/json/encoding.rb