From: Colin Bartlett on
[Note: parts of this message were removed to make it a legal post.]

On Tue, Jul 13, 2010 at 1:59 PM, Xavier Noria <fxn(a)hashref.com> wrote:

> On Tue, Jul 13, 2010 at 2:42 PM, Abder-Rahman Ali
> <abder.rahman.ali(a)gmail.com> wrote:
>
> > In "why's poignant guide to Ruby" book, it mentioned that: $LOAD_PATH is
> > a global variable. Isn't this a global "constant"?
>
> Not really.
>
> Ruby has no concept of local constants, they are global by definition.
> Constants can't start with a dollar, they must begin with a capital
> letter.
>
> To say you want a particular variable to be global you use the sigil.
> Global variables are distinguished by the leading dollar sign, and
> have no requirement about the case used in the identifier. There's for
> example $stdout.
>
> Constants in addition belong to classes and modules, so they may have
> qualified names like ActiveRecord::Base. That means: the object stored
> in the constant Base, that is stored in the object that is stored in
> the constant ActiveRecord, which happens to be a module.
>
> Variables, either local or global, have no namespaces.
>

On Tue, Jul 13, 2010 at 2:18 PM, Xavier Noria <fxn(a)hashref.com> wrote:

> On Tue, Jul 13, 2010 at 3:08 PM, Abder-Rahman Ali
> <abder.rahman.ali(a)gmail.com> wrote:
>
> > Thanks for your reply. So, is your point here, that anything starting
> > with a $ is a global variable, regardless uppercase or lowercase
> > letters.
>
> Correct.
>
> > I asked my question since I know that of Ruby's convention is that
> > constants have to begin with an uppercase letter.
>
> That's right. Point is sigils ($, @, @@), are considered to be part of
> variable names. That's why the rule is worded that way.
>
> Now that we are on it, another tidbit is that Ruby actually lets you
> change the value a constant holds. That's a rite of passage, embrace
> contradictions! :). You get a warning though.
>

Well, that's a good question that hadn't occurred to me in over 8 years, and
two good succinct replies.

The following is intended to test my understanding, and any corrections are
welcome.

1. A constant has a "constant" reference to an object. You can change the
"internal" state of that object, and Ruby won't object or warn you.

2. Ruby lets you change the object that a constant "refers to", albeit with
a warning.

irb
CK = "actor" #=> "actor"
CK << " - Salome" #=> "actor - Salome"
CK = "actress" #=> warning: already initialized constant CK
#=> "actress"

From: Brian Candler on
Colin Bartlett wrote:
> The following is intended to test my understanding, and any corrections
> are
> welcome.
>
> 1. A constant has a "constant" reference to an object. You can change
> the
> "internal" state of that object, and Ruby won't object or warn you.
>
> 2. Ruby lets you change the object that a constant "refers to", albeit
> with
> a warning.
>
> irb
> CK = "actor" #=> "actor"
> CK << " - Salome" #=> "actor - Salome"
> CK = "actress" #=> warning: already initialized constant CK
> #=> "actress"

Yes, that's all correct.

String#replace and File#reopen are useful in these cases.
--
Posted via http://www.ruby-forum.com/.