Feature #12300
closedAllow Object#clone to take freeze: false keyword argument to not freeze the clone
Description
This allows Object#clone to not freeze the resulting object, which fixes a long standing problem in ruby in that you cannot get an unfrozen copy of an object that includes a copy of the object's singleton class. Previously, clone always returned a frozen object, and dup did not copy the singleton class. This adds the ability to get an unfrozen clone of an object that includes a copy of the object's singleton class, allowing further modification.
Among other things, this allows the ability to create modified clones of objects that have singleton classes:
class A
def clone(arg)
obj = super(freeze: false)
# modify obj based on arg
obj.freeze
end
end
I think this is a simpler and more flexible approach to the same problem that #12092 tries to solve.
Files
Updated by shyouhei (Shyouhei Urabe) over 8 years ago
Sounds much simpler than the previous one to understand what is happening. Also it seems backwards-compatible.
Given the needs of this kind, I'd like to +1.
Updated by matz (Yukihiro Matsumoto) over 8 years ago
Sounds reasonable.
Matz.
Updated by shyouhei (Shyouhei Urabe) over 8 years ago
- Status changed from Open to Closed
Applied in changeset r55786.
Object#clone with freeze: false [Feature #12300]
* object.c (rb_obj_clone2): Allow Object#clone to take freeze:
false keyword argument to not freeze the clone.
[ruby-core:75017][Feature #12300]
* test/ruby/test_object.rb (TestObject): test for it.