Shouldn't this be called a global constant?

A

Abder-Rahman Ali

In "why's poignant guide to Ruby" book, it mentioned that: $LOAD_PATH is
a global variable. Isn't this a global "constant"?
 
X

Xavier Noria

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.
 
A

Abder-Rahman Ali

Xavier said:
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.

Thanks for your reply. So, is your point here, that anything starting
with a $ is a global variable, regardless uppercase or lowercase
letters.

I asked my question since I know that of Rub's convention is that
constants have to begin with an uppercase letter.
 
X

Xavier Noria

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 Rub'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.
 
C

Colin Bartlett

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

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.



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"
 
B

Brian Candler

Colin said:
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top