Feature #12092
Updated by nobu (Nobuyoshi Nakada) over 8 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.