Project

General

Profile

Feature #12092

Updated by nobu (Nobuyoshi Nakada) over 5 years ago

This allows creating modified clones of frozen objects that have 
 singleton classes: 

 ~~~ruby ~~~ 
 a = [1,2,3] 
 def a.fl; first + last; end 
 a.freeze 
 a.fl # => 4 

 clone = a.clone{|c| c << 10} 
 clone.last # => 10 
 clone.fl # => 11 
 clone.frozen? # => true 
 ~~~ 

 Previously, this was not possible at all.    If an object was 
 frozen, the clone was frozen before the cloned object could 
 be modified.    It was possible to modify the clone using 
 `initialize_clone` initialize_clone or `initialize_copy`, initialize_copy, but you couldn't change how 
 to modify the clone on a per-call basis.    You couldn't use `dup` dup 
 to return an unfrozen copy, modify it, and then freeze it, because 
 `dup` dup doesn't copy singleton classes. 

 This allows ruby to be used in a functional style with immutable 
 data structures, while still keeping the advantages of singleton 
 classes.

Back