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.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