diff options
author | Kasper Timm Hansen <kaspth@gmail.com> | 2016-12-29 20:12:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-29 20:12:19 +0100 |
commit | 80ddb7ee2ee078a3c457eefa49184f4fd699a91a (patch) | |
tree | e6b7c9c2a54bce13b83f6e1436e4bf0b8e5ffecd /guides | |
parent | e983948f1409070476a1f13c415ec7532cad17f6 (diff) | |
parent | 194f97c51e75d4d0e355091776af6e4c8bb83d82 (diff) | |
download | rails-80ddb7ee2ee078a3c457eefa49184f4fd699a91a.tar.gz rails-80ddb7ee2ee078a3c457eefa49184f4fd699a91a.tar.bz2 rails-80ddb7ee2ee078a3c457eefa49184f4fd699a91a.zip |
Merge pull request #27346 from utilum/core_ext_guide_duplicable
Update list of `duplicable?` objects in AS core_ext guide [ci skip]
Diffstat (limited to 'guides')
-rw-r--r-- | guides/source/active_support_core_extensions.md | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/guides/source/active_support_core_extensions.md b/guides/source/active_support_core_extensions.md index 6bbc79a326..bfe6b7b7ea 100644 --- a/guides/source/active_support_core_extensions.md +++ b/guides/source/active_support_core_extensions.md @@ -135,36 +135,50 @@ NOTE: Defined in `active_support/core_ext/object/blank.rb`. ### `duplicable?` -A few fundamental objects in Ruby are singletons. For example, in the whole life of a program the integer 1 refers always to the same instance: +In Ruby 2.4 most objects can be duplicated throuh `dup` or `clone`, except +method objects and certain numbers. Ruby 2.2 and 2.3 can't duplicate `nil`, +`false`, `true`, and symbols, as well as instances of `Float`, `Fixnum` +and `Bignum`. ```ruby -1.object_id # => 3 -Math.cos(0).to_i.object_id # => 3 +"foo".dup # => "foo" +"".dup # => "" +1.method(:+).dup # => TypeError: allocator undefined for Method +Complex(0).dup # => TypeError: can't copy Complex ``` -Hence, there's no way these objects can be duplicated through `dup` or `clone`: +Active Support provides `duplicable?` to programmatically query an object about +this property: ```ruby -true.dup # => TypeError: can't dup TrueClass +"foo".duplicable? # => true +"".duplicable? # => true +Rational(1).duplicable? # => false +Complex(1).duplicable? # => false +1.method(:+).duplicable? # => false ``` -Some numbers which are not singletons are not duplicable either: +`duplicable?` returns the correct result for the version of Ruby used. ```ruby -0.0.clone # => allocator undefined for Float -(2**1024).clone # => allocator undefined for Bignum -``` +# version 2.4 +nil.dup # => nil +:my_symbol.dup # => :my_symbol +1.dup # => 1 -Active Support provides `duplicable?` to programmatically query an object about this property: +nil.duplicable? # => true +:my_symbol.duplicable? # => true +1.duplicable? # => true -```ruby -"foo".duplicable? # => true -"".duplicable? # => true -0.0.duplicable? # => false -false.duplicable? # => false -``` +# version 2.2 and 2.3 +nil.dup # => TypeError: can't dup NilClass +:my_symbol.dup # => TypeError: can't dup Symbol +1.dup # => TypeError: can't dup Fixnum -By definition all objects are `duplicable?` except `nil`, `false`, `true`, symbols, numbers, class, module, and method objects. +nil.duplicable? # => false +:my_symbol.duplicable? # => false +1.duplicable? # => false +``` WARNING: Any class can disallow duplication by removing `dup` and `clone` or raising exceptions from them. Thus only `rescue` can tell whether a given arbitrary object is duplicable. `duplicable?` depends on the hard-coded list above, but it is much faster than `rescue`. Use it only if you know the hard-coded list is enough in your use case. |