aboutsummaryrefslogtreecommitdiffstats
path: root/guides
diff options
context:
space:
mode:
authorKasper Timm Hansen <kaspth@gmail.com>2016-12-29 20:12:19 +0100
committerGitHub <noreply@github.com>2016-12-29 20:12:19 +0100
commit80ddb7ee2ee078a3c457eefa49184f4fd699a91a (patch)
treee6b7c9c2a54bce13b83f6e1436e4bf0b8e5ffecd /guides
parente983948f1409070476a1f13c415ec7532cad17f6 (diff)
parent194f97c51e75d4d0e355091776af6e4c8bb83d82 (diff)
downloadrails-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.md48
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.