[ruby-core:78420] [Ruby trunk Feature#12979] Avoid exception for #dup on Integer (and similar cases)
From:
zn@...
Date:
2016-11-29 14:52:59 UTC
List:
ruby-core #78420
Issue #12979 has been updated by Kazuhiro NISHIYAMA.
Integer (Fixnum) can dup now.
But Integer (Bignum) can't dup.
~~~
% ruby -ve '1.dup'
ruby 2.4.0dev (2016-11-29 trunk 56928) [x86_64-linux]
% ruby -ve '(1<<64).dup'
ruby 2.4.0dev (2016-11-29 trunk 56928) [x86_64-linux]
-e:1:in `dup': allocator undefined for Integer (TypeError)
from -e:1:in `<main>'
~~~
----------------------------------------
Feature #12979: Avoid exception for #dup on Integer (and similar cases)
https://bugs.ruby-lang.org/issues/12979#change-61792
* Author: Martin D端rst
* Status: Open
* Priority: Normal
* Assignee: Nobuyoshi Nakada
----------------------------------------
This is a proposal resulting from a discussion in Bug #11929. Because this is proposing a different solution from #11929, it has a new number.
#11929 shows that people are confused that e.g. 3.dup throws an exception (but Integer#dup is actually implemented, so Integer.respond_to? :dup => true).
Integer#dup should fail silently, returning the receiver, in the same way as Integer#freeze fails silently. Citing from #11929 (comment by Mike Vastola): "If the object can't be duped/cloned because it's an immediate, dup/clone should return the object itself. (There shouldn't be any harm in doing so since nothing about the object can be changed in the first place.)". Citing some more:
> I literally can't imagine any scenario in which a dev, when, say, coding a class with the line:
>
> return val.dup.freeze
> .. really wants an Exception thrown when val happens to be de-facto un-dup-able. What they really want is:
>
> return val.dup.freeze rescue val
The proposal also has the advantage that it leads to a much more unified, streamlined protocol, avoiding needless exposition of internals. It would do exactly what dup (and clone) are described to do, namely (pretend to) return a shallow copy.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>