----- Original Message ----- 
From: HarryO <harryo / zipworld.com.au>
Newsgroups: comp.lang.ruby
To: ruby-talk ML <ruby-talk / ruby-lang.org>; <undisclosed-recipients: ;>
Sent: Monday, July 09, 2001 8:31 PM
Subject: [ruby-talk:17588] Re: Constants and Variables

> > Because that freezes the object that MAX_SIZE references, not MAX_SIZE
> > itself.
> 
> Of course!  Sorry, I should have realised that.
> 
> However ...  I figured I could then do 
> 
> max_size = 10
> max_size.freeze
>         max_size = 5 # 3
>         puts "max = #{max}" # 4
> 
> and line 3 would produce an error, line 4 would print 10.
> 
> However, that doesn't work.  I get no errors and max_size prints as 5.
> 
> Am I just really thick, or is there a bug here?

You're not thick... you're just not yet thinking in Ruby.

Freezing does NOT affect a variable. Not at all! Say it to 
youself...  :)

Freezing affects the *object* referred to by the variable.

Thus an operation that actually tries to change a frozen object
will fail.

  x = "Hello"
  x.freeze       
  x[0] = "J"

  # -:3:in `[]=': can't modify frozen string (TypeError)
  #       from -:3

Think of it this way: x isn't frozen; it's "Hello" that's frozen.

But an operation that merely changes a variable to refer to 
some other object is fine.

  x = "Hello"
  x.freeze       
  x = "Jello"
  # The object "Hello" is still frozen... though if it is not 
  # referred to anywhere, it will be garbage collected now...

Sometimes the distinction is unclear (to me, anyway).

When in doubt, try it out.

Hal