From: "kstephens (Kurt Stephens)" Date: 2012-07-12T09:54:12+09:00 Subject: [ruby-core:46340] [ruby-trunk - Feature #6688] Object#replace Issue #6688 has been updated by kstephens (Kurt Stephens). How would it behave for immediate VALUEs (Fixnum, Symbol, etc.)? Or value classes that are immutable or often occur as literals (Float, Rational, Time, etc.)? This would probably be very difficult to implement in JRuby (and other Ruby implementations) without adding indirection handles between object references and their memory locations; and would reduce performance. Without indirection, it's difficult to remap references on the stack and other structures that may be opaque to the CRuby GC. If I recall correctly, early versions of Objective-C (pre-NeXTSTEP) used indirection handles to reduce memory fragmentation, thus it may have been supported there. This "feature" would constrain low-level memory management decisions in a fundamental way. ---------------------------------------- Feature #6688: Object#replace https://bugs.ruby-lang.org/issues/6688#change-27956 Author: prijutme4ty (Ilya Vorontsov) Status: Open Priority: Normal Assignee: Category: Target version: I suggest that #replace works not only on Enumerables but on any Object. It can make use the same object in different places more consistent. It makes it possible to write class Egg; end class Hen; end class HenHouse; attr_accessor :species; end class Incubator; def incubate(egg) Hen.new; end # Here it is! class IncubatorWithReplace; def incubate(egg) egg.replace(Hen.new) end end e1,e2,e3 = Egg.new, Egg.new, Egg.new h1, h2 = HenHouse.new, HenHouse.new # One egg is shared between hen houses h1.species = [e1, e2] h2.species = [e1, e3] p h1 # ==> ,#] p h2 # ==> ,#] # First option. It's bad choise because it makes two "data structures" HenHouse inconsistent: # they have different object while must have the same h1[0] = Incubator.new.incubate(h1[0]) p h1 # ==> ,#] p h2 # ==> ,#] # Second option is ok - now both shared objects're changed. IncubatorWithReplace.new.incubate(h1[0]) h1 # ==> ,#] h2 # ==> ,#] # Third option is bad - it wouldn't affect HenHouses at all e1 = Incubator.new.incubate(e1) p h1 # ==> ,#] p h2 # ==> ,#] # while Fourth option is ok and works as second do IncubatorWithReplace.new.incubate(e1) ## would affect both HenHouses p h1 # ==> ,#] p h2 # ==> ,#] I can't imagine how it'd be realized, it looks like some dark magic with ObjectSpace needed to replace one object at a reference with another at the same reference. But I didn't found a solution. About ret-value. I think it should be two forms: Object#replace(obj, retain = false) If retain is false #replace should return a reference to a new object (in fact the same reference as to old object but with other content) If retain is true, old object should be moved at another place and new reference to it is returned, so: e1 # ==> e1.replace( Hen.new, true ) # ==> e1 # ==> -- http://bugs.ruby-lang.org/