From: Mike Gold Date: 2009-01-23T14:25:03+09:00 Subject: Re: String doesnt auto dup on modification RK Sentinel wrote: > > - Do you keep freezing Strings you make in your classes to avoid > accidental change > > - Do you habitually dup() your string ? > One possibility is copy-on-write. require 'delegate' class CopyOnWriteString < DelegateClass(String) DESTRUCTIVE_METHODS = String.public_instance_methods(false).grep(/!/).map(&:to_sym) + [ :[]=, :<<, :concat, :initialize_copy, :replace, :setbyte, # ... and probably others ... ] DESTRUCTIVE_METHODS.each { |m| define_method(m) { |*args, &block| __setobj__(__getobj__.dup) __getobj__.send(m, *args, &block) } } end class Person def initialize(name) @name = name end def name CopyOnWriteString.new(@name) end end person = Person.new("fred") name = person.name p name #=> "fred" p person.name #=> "fred" name << " flintstone" p name #=> "fred flintstone" p person.name #=> "fred" (I've used some 1.8.7+ only features.) -- Posted via http://www.ruby-forum.com/.