Excerpts from Stu P. D'naim's message of 2013-11-05 17:10:30 +0100:
> Every tutorial I read says global variables are bad, but I'm struggling
> with the ways to avoid them. In this case (wich actually works), I have
> 3 files - each having it's own class and purpose. Class Menu is where
> program begins. Class Mynumbers should generate a bunch of variables
> through calculations. Class Myfiles should be able to read/write those
> variables ... very simplified version of my program looks like this:
> 
> -------------------------------------
> #menu.rb
> 
> require_relative "myfiles.rb"
> require_relative "mynumbers.rb"
> 
> class Menu
>   def initialize
>     $nums = Mynumbers.new
>     $nums.calculate
>     Myfiles.show
>   end
> end
> 
> start = Menu.new
> -------------------------------------
> #mynumbers.rb
> 
> class Mynumbers
>   attr_reader :my_var1, :my_var2
> 
>   def calculate
>     @my_var1 = rand(2..31)
>     @my_var2 = rand(200..310)
>   end
> end
> ------------------------------------
> #myfiles.rb
> 
> class Myfiles
>   def self.show
>     puts $nums.class
>     puts $nums.my_var1
>     puts $nums.my_var2.inspect
>   end
> end
> -------------------------------------
> 
> TL;DR - is there a way to avoid using global instance $nums ?
> (and is there really a reason for that, since my program works)

You can replace the global variable $nums with a local variable in Menu
and make MyClass.show take an argument:

class Menu
  def initialize
    nums = Mynumbers.new
    nums.calculate
    Myfiles.show nums
  end
end

class Myfiles
  def self.show ns
    puts ns.class
    puts ns.my_var1
    puts ns.my_var2.inspect
  end
end

If this is only a toy program which won't grow much in size, you can
leave it as it is. However, if you think it'll become larger, in my
opinion, you should make the effort of getting rid of global variables
now, rather than having to do so later when the code has become more
complex.

I hope this helps

Stefano