How do you use global variables or constant values in Ruby?

global-variables, ruby

Solution

One thing you need to realize is in Ruby everything is an object. Given that, if you don't define your methods within `Module` or `Class`, Ruby will put it within the `Object` class. So, your code will be local to the `Object` scope.

A typical approach on Object Oriented Programming is encapsulate all logic within a class:

class Point
  attr_accessor :x, :y

  # If we don't specify coordinates, we start at 0.
  def initialize(x = 0, y = 0)
    # Notice that `@` indicates instance variables.
    @x = x
    @y = y
  end

  # Here we override the `+' operator.
  def +(point)
    Point.new(self.x + point.x, self.y + point.y)
  end

  # Here we draw the point.
  def draw(offset = nil)
    if offset.nil?
      new_point = self
    else
      new_point = self + offset 
    end
    new_point.draw_absolute
  end

  def draw_absolute
    puts "x: #{self.x}, y: #{self.y}"
  end
end

first_point = Point.new(100, 200)
second_point = Point.new(3, 4)

second_point.draw(first_point)

Hope this clarifies a bit.

Problem

I have a program that looks like: ``` $offset = Point.new(100, 200); def draw(point) pointNew = $offset + point; drawAbsolute(point) end draw(Point.new(3, 4)); ``` the use of `$offset` seems a bit weird. In C, if I define something outside of any function, it is a global variable automatically. Why in Ruby does it have to be `$offset` but cannot be `offset` and still be global? If it is `offset`, then it is a local? But local to where, because it feels very much global. Are there better ways to write the code above? The use of `$offset` may seem a bit ugly at first. Update: I can put this offset inside a `class` definition, but what if two or several classes need to use this constant? In this case do I still need to define an `$offset`?

Original source