Morning all,
@dependencies.freeze
@dependencies += [“blah”, “blah”]
does not error out due to modifying a frozen array (1.8.7 p72).
Is this expected behaviour? Up until now I’ve considered freezing an
array as making the array completely read only.
Cheers,
James
On Wed, Mar 25, 2009 at 4:00 PM, James F.
[email protected] wrote:
Morning all,
@dependencies.freeze
@dependencies += [“blah”, “blah”]
does not error out due to modifying a frozen array (1.8.7 p72).
[…]
+= creates a new array and assigns it to @dependencies. The original
array remains frozen but @dependencies no longer refers to it.
To illustrate:
$: irb
01> a = b = [1, 2]
→ [1, 2]
02> a.freeze
→ [1, 2]
03> b.frozen?
→ true
04> b += [3, 4]
→ [1, 2, 3, 4]
05> a.frozen?
→ true
solidarity,
lasitha
Ah, I understand - thanks. My next question is - is it possible to
prevent this?
From: lasitha [[email protected]]
Sent: 25 March 2009 10:48
To: ruby-talk ML
Subject: Re: appending an array to a frozen array
On Wed, Mar 25, 2009 at 4:00 PM, James F.
[email protected] wrote:
Morning all,
@dependencies.freeze
@dependencies += [“blah”, “blah”]
does not error out due to modifying a frozen array (1.8.7 p72).
[…]
+= creates a new array and assigns it to @dependencies. The original
array remains frozen but @dependencies no longer refers to it.
To illustrate:
$: irb
01> a = b = [1, 2]
→ [1, 2]
02> a.freeze
→ [1, 2]
03> b.frozen?
→ true
04> b += [3, 4]
→ [1, 2, 3, 4]
05> a.frozen?
→ true
solidarity,
lasitha
James F. wrote:
Ah, I understand - thanks. My next question is - is it possible to prevent this?
…
@dependencies.freeze
@dependencies += [“blah”, “blah”]
does not error out due to modifying a frozen array (1.8.7 p72).
Use an attr_reader rather than an instance variable?
2009/3/25 James F. [email protected]:
Ah, I understand - thanks. My next question is - is it possible to prevent this?
Since you are using an instance variable you control how it is
accessed. So, yes. If you want to know whether there is a hard way to
prevent reassignment to instance variables, the only safe way I know
off the top of my head is to freeze the owner:
irb(main):001:0> o=Object.new
=> #Object:0x10171ed8
irb(main):002:0> o.instance_variable_set “@foo”, 1
=> 1
irb(main):003:0> o
=> #<Object:0x10171ed8 @foo=1>
irb(main):004:0> o.freeze
=> #<Object:0x10171ed8 @foo=1>
irb(main):005:0> o.instance_variable_set “@foo”, 2
RuntimeError: can’t modify frozen object
from (irb):5:in instance_variable_set' from (irb):5 from /opt/bin/irb19:12:in
’
irb(main):006:0>
Kind regards
robert