Ruby Variables and Constants


Variables are the memory locations which holds any data to be used by any program.

There are five types of variables supported by Ruby. You already have gone through a small description of these variables in previous chapter as well. These five types of variables are explained in this chapter.


Ruby Global Variables:

Global variables begin with $. Uninitialized global variables have the value nil and produce warnings with the -w option.

Assignment to global variables alters global status. $_ and $~ have local scope. These are exceptions to the global variable naming convention (there are historical reasons for the names).

There are two more exeptions to the global variable naming convention:

It is not recommended to use global variables. They are dangerous because they can be written to from anywhere, making programs cryptic.

Here is an example showing usage of global variable.

      $global_variable = 10
      class Class1
        def print_global
           puts "Global variable in Class1 is #$global_variable"
        end
      end
      class Class2
        def print_global
           puts "Global variable in Class2 is #$global_variable"
        end
      end
      
      class1obj = Class1.new
      class1obj.print_global
      class2obj = Class2.new
      class2obj.print_global
      

Here $global_variable is a global variable. This will produce following result:

NOTE: In Ruby you CAN access value of any variable or constant by putting a hash (#) character just before that variable or constant.

      Global variable in Class1 is 10
      Global variable in Class2 is 10
      

Ruby Instance Variables:

Instance variables begin with @. Uninitialized instance variables have the value nil and produce warnings with the -w option.

Here is an example showing usage of Instance Variables.

      class Customer
         def initialize(id, name, addr)
            @cust_id=id
            @cust_name=name
            @cust_addr=addr
         end
         def display_details()
            puts "Customer id #@cust_id"
            puts "Customer name #@cust_name"
            puts "Customer address #@cust_addr"
          end
      end
      
      # Create Objects
      cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
      cust2=Customer.new("2", "Poul", "New Empire road, Khandala")
      
      # Call Methods
      cust1.display_details()
      cust2.display_details()
      

Here @cust_id, @cust_name and @cust_addr are instance variables. This will produce following result:

      Customer id 1
      Customer name John
      Customer address Wisdom Apartments, Ludhiya
      Customer id 2
      Customer name Poul
      Customer address New Empire road, Khandala
      

Ruby Class Variables:

Class variables begin with @@ and must be initialized before they can be used in method definitions.

Referencing an uninitialized class variable produces an error. Class variables are shared among descendants of the class or module in which the class variables are defined.

Overriding class variables produce warnings with the -w option.

Here is an example showing usage of class variable:

      class Customer
         @@no_of_customers=0
         def initialize(id, name, addr)
            @cust_id=id
            @cust_name=name
            @cust_addr=addr
         end
         def display_details()
            puts "Customer id #@cust_id"
            puts "Customer name #@cust_name"
            puts "Customer address #@cust_addr"
          end
          def total_no_of_customers()
             @@no_of_customers += 1
             puts "Total number of customers: #@@no_of_customers"
          end
      end
      
      # Create Objects
      cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
      cust2=Customer.new("2", "Poul", "New Empire road, Khandala")
      
      # Call Methods
      cust1.total_no_of_customers()
      cust2.total_no_of_customers()
      

Here @@no_of_customers is a class variable. This will produce following result:

      Total number of customers: 1
      Total number of customers: 2
      

Ruby Local Variables:

Local variables begin with a lowercase letter or _. The scope of a local variable ranges from class, module, def, or do to the corresponding end or from a block's opening brace to its close brace {}.

When an uninitialized local variable is referenced, it is interpreted as a call to a method that has no arguments.

Assignment to uninitialized local variables also serves as variable declaration. The variables only to exist until the end of the current scope is reached. The lifetime of local variables is determined when Ruby parses the program.

In the above example local variables are id, name and addr.


Ruby Pseudo-Variables:

They are special variables that have the appearance of local variables but behave like constants. You can not assign any value to these variables.


Ruby Constants:

Constants begin with an uppercase letter. Constants defined within a class or module can be accessed from within that class or module, and those defined outside a class or module can be accessed globally.

Constants may not be defined within methods. Referencing an uninitialized constant produces an error. Making an assignment to a constant that is already initialized produces a warning.

      class Example
         VAR1 = 100
         VAR2 = 200
         def show
             puts "Value of first Constant is #{VAR1}"
             puts "Value of second Constant is #{VAR2}"
         end
      end
      
      # Create Objects
      object=Example.new()
      object.show
      

Here VAR1 and VAR2 are constant. This will produce following result:

      Value of first Constant is 100
      Value of second Constant is 200