Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to share variables across my .rb files?

Tags:

include

ruby

I have a few .rb files and I want to use the same variables in all of them. Let's say variable test_variable = "test" should be accessible from all my .rb files. How can I achieve that?

I created settings.rb file with test_variable = "test" then used require 'settings' in another .rb file, but it didn't work. I would like to use require not load.

I tried to make the variable global by prefixing the variable name with $, but I am still getting undefined local variable or method 'test_variable' for main:Object (NameError).

like image 621
Radek Avatar asked Nov 30 '11 23:11

Radek


2 Answers

  1. Constants (which include modules and classes) are added to the shared global environment:

    phrogz$ cat constants1.rb  TEST_VARIABLE = "test"  phrogz$ cat constants2.rb  require_relative 'constants1' p TEST_VARIABLE  phrogz$ ruby constants2.rb  "test" 
  2. Instance variables declared in main are all part of the same main:

    phrogz$ cat instance1.rb  @test_variable = "test"  phrogz$ cat instance2.rb  require_relative 'instance1' p @test_variable  phrogz$ ruby instance2.rb  "test" 
  3. Global variables are also all part of the same environment (tested in 1.8.6, 1.8.7, and 1.9.2):

    phrogz$ cat global1.rb  $test_variable = "test"  phrogz$ cat global2.rb  require_relative 'global1' p $test_variable, RUBY_DESCRIPTION  phrogz$ ruby global2.rb  "test" "ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]" 
like image 102
Phrogz Avatar answered Sep 21 '22 10:09

Phrogz


Ruby will never share local variables between files. You can wrap them in a Module though:

module SharedVaribles   @test_var="Hello, World"    def self.test_var     return @test_var   end    def self.test_var=(val)     @test_val=val;   end end 

Put that in settings.rb, require it into all your files, and use SharedVaribles.test_var and SharedVaribles.test_var= to access the variable. Remember, Ruby's require is nothing like C's #include, it is much more complex. It executes the file, then imports all constants, modules, and classes to the requireer.

like image 31
Linuxios Avatar answered Sep 23 '22 10:09

Linuxios