From: Ryan Leavengood Date: 2005-10-20T23:01:52+09:00 Subject: Re: DbC, const and freeze. On 10/19/05, John Carter wrote: > > For example, look at this hole... > irb > irb(main):001:0> a = [[1,2],[3,4]] > => [[1, 2], [3, 4]] > irb(main):002:0> a.freeze > => [[1, 2], [3, 4]] > irb(main):003:0> a << [9] > RuntimeError: can't modify frozen array > from (irb):3:in `<<' > from (irb):3 > from :0 > irb(main):004:0> a[0]<<1 > => [1, 2, 1] > irb(main):005:0> a > => [[1, 2, 1], [3, 4]] > irb(main):006:0> > > Even though "a" was frozen, I still could modify the things "a" contained. Fair enough. How about this: irb(main):001:0> class Object irb(main):002:1> def deep_freeze irb(main):003:2> self.freeze irb(main):004:2> if self.respond_to? :each irb(main):005:3> self.each do |i| irb(main):006:4* i.deep_freeze irb(main):007:4> end irb(main):008:3> end irb(main):009:2> end irb(main):010:1> end => nil irb(main):011:0> a=[[[1,2,3],[4,5]],[6,7]] => [[[1, 2, 3], [4, 5]], [6, 7]] irb(main):012:0> a.deep_freeze => [[[1, 2, 3], [4, 5]], [6, 7]] irb(main):013:0> a << 9 TypeError: can't modify frozen array from (irb):13:in `<<' from (irb):13 irb(main):014:0> a[0] << 9 TypeError: can't modify frozen array from (irb):14:in `<<' from (irb):14 irb(main):015:0> a[0][0] << 9 TypeError: can't modify frozen array from (irb):15:in `<<' from (irb):15 irb(main):016:0> Does anyone else love that name? ;) Ryan